5月8日

Listソートの復習

Comparatorを使ったStrategyパターンです。

Mediaをソートするテスト MediaSortTest を作る。

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.junit.Before;
import org.junit.Test;


public class MediaSortTest {
	private List<Media> list;
	private Media m1, m2, m3, m4;

	@Before
	public void prepareMedia() {
		m1 = new Media();
		m1.setTitle("CCCCC");
		m1.setSize(400);
		m1.setAuthor("すずき");
		m2 = new Media();
		m2.setTitle("DDDDDD");
		m2.setSize(300);
		m2.setAuthor("さいとう");
		m3 = new Media();
		m3.setTitle("AAAAAA");
		m3.setSize(200);
		m3.setAuthor("ほんだ");
		m4 = new Media();
		m4.setTitle("BBBBBBBB");
		m4.setSize(100);
		m4.setAuthor("いもと");
		list = new ArrayList<Media>();
		list.add(m1);
		list.add(m2);
		list.add(m3);
		list.add(m4);
	}

	@Test
	public void test() {
		assertThat(list.get(0), is(m1));
		Collections.sort(list, new MediaTitleComparator());
		assertThat(list.get(0), is(m3));
		assertThat(list.get(1), is(m4));
		assertThat(list.get(2), is(m1));
		assertThat(list.get(3), is(m2));
		printMediaList();

		Collections.sort(list, new MediaSizeComparator());
		assertThat(list.get(0), is(m4));
		assertThat(list.get(1), is(m3));
		assertThat(list.get(2), is(m2));
		assertThat(list.get(3), is(m1));
		printMediaList();

		Collections.sort(list, new MediaAuthorComparator());
		assertThat(list.get(0), is(m4));
		assertThat(list.get(1), is(m2));
		assertThat(list.get(2), is(m1));
		assertThat(list.get(3), is(m3));
		printMediaList();
	}

	private void printMediaList() {
		for (Media m : list) {
			System.out.println(m.getTitle() + " " + m.getSize() + " " + m.getAuthor());
		}
		System.out.println();
	}
}

ソートした結果を printMediaList() メソッドでコンソールに出力するようにコードを追加。

コンソールに出力される結果は以下のとおり。

AAAAAA 200 ほんだ
BBBBBBBB 100 いもと
CCCCC 400 すずき
DDDDDD 300 さいとう

BBBBBBBB 100 いもと
AAAAAA 200 ほんだ
DDDDDD 300 さいとう
CCCCC 400 すずき

BBBBBBBB 100 いもと
DDDDDD 300 さいとう
CCCCC 400 すずき
AAAAAA 200 ほんだ

インタフェースComparatorでメソッドを定義。MediaXxxxComparator で、比較のアルゴリズムを実装。Collections.sort()メソッドが各Comparatorのインスタンスを受け取ってソートを実行する。

このようなクラスの構造をStrategy(ストラテジー)パターンと呼ぶ。

ストリーム

ストリームは、データを入出力するための機能を提供します。

Javaでは、入力と出力が分離されています。入力は InputStream、出力は OutputStream によって提供されています。特に扱うデータがテキストであれば、InputStream の代わりに Reader を、OutputStream の代わりに Writer を使用できます。

新規プロジェクト c24 を作成する。実行環境JREは「1.7」を選択する。

LIST24-01 WriterSample.java を入力して実行する。

WriterSampleを実行すると、コンソールに END と出力される。c24プロジェクトを右クリックし「リフレッシュ」を選択すると、c24 プロジェクト内に出力先ファイル hoge.txt が表示される。

Writer のデコレータを使う

LIST 24-02 WriterSample2.java を入力して実行する。実行後に hoge.txt をダブルクリックして書かれた内容を確認する。

Readerを使う

LIST 24-03 ReaderSample.java を入力して実行する。hoge.txt の内容がコンソールに表示される。

バイナリデータの入出力

OutputStreamを使う

LIST 24-04 OutputSample.java を入力して実行する。c24プロジェクトを右クリックし「リフレッシュ」を選択すると、c24 プロジェクト内に出力先ファイル btest.bin が表示される。

InputStreamを使う

LIST 24-05 InputSample.java を入力して実行する。

ファイルをコピーする

LIST 24-06 FileCopy.java を入力して実行する。

必ずcloseする

LIST 24-07 CloseSample.java を入力して実行する。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です