4月17日

オブジェクトの比較

前回は、オブジェクトの同一性を示すためにequals()メソッドのオーバーライドを作成した。今回は、異なるオブジェクトの順序付けに関する実装を行う。

ソートとComparator

オブジェクトをソートするには、オブジェクトを比較する仕組みが必要。そのためのインタフェースが Comparator。

Comparatorは比較のためのメソッド compare()を定義している。

Comparator の Javadoc

int compare(T o1, T o2)
パラメータ:
o1 - 比較対象の最初のオブジェクト
o2 - 比較対象の 2 番目のオブジェクト 
戻り値:
最初の引数が 2 番目の引数より小さい場合は負の整数、両方が等しい場合は 0、最初の引数が 2 番目の引数より大きい場合は正の整数 
例外: 
ClassCastException - 引数の型がこのコンパレータによる比較を妨げる場合

テキストの例題を入力して動かしてみる

テキストでは同一ファイル内にComparatorを作成しているが、実際には別ファイルで作成すること。

独自クラスに対して実装してみる

タイトル、作者、作成日、ファイルサイズ、長さ(時間)の5つの属性を持つ Media クラスを作成して、それを比較するための Comparator を実装する。

Eclipseで簡単にクラス Media を作成する手順。

  1. 新規クラスでMediaを作成する。
  2. 5つのインスタンス変数を定義する。
  3. Eclipseの「ソース」メニューから「setter/getterの生成」を選択する。
  4. 生成する属性にチェックを入れて「OK」する。

Media のタイトルを比較するための MediaTitleComparator を作成する。クラスを作成するときにインタフェース Comparator を追加しておくこと。

MediaTitleComparator を右クリックして新規JUnitテストケースを作成する。テストメソッドは compare() を選択して「完了」する。

テストが生成されたら、テストを実行して失敗することを確認する。

タイトルを比較するテストを追加する。

4月10日

コレクションフレームワーク

オブジェクト同一性についての復習

オブジェクトの同一性は、ObjectクラスのhashCode()メソッドとequals()メソッドにより検査される。

hashCode()は、同一ではないインスタンスに対しては、できるだけ異なる値を返したほうがいいが、仕様では同一でもかまわないので常に1を返すようにする。

プログラムを実行するときにequals()メソッドがホットスポット(呼び出される回数が多い)となる場合は、異なる値を返すことを検討する。

equals()の実装は、JUnitテストケースを利用する。Manクラスのオブジェクの場合は、名前と年齢が一致していれば同一とみなす。

Mapインタフェース

MapはListとともに、Javaでよく利用される。

Mapは、キーと値のペアを格納する。キーは重複しない。値は重複する可能性がある。(異なるキーに対して同一の値を格納する場合など)

Listと配列の相互変換

配列をListに変換するには、ArraysユーティリティのasList()メソッドを使用する。

Listを配列に変換するには、ListインタフェースのtoArray()メソッドを使用する。

北九州大学大学院のソフトウェア公開授業
公開授業2014年前期のお知らせ

4月3日

コレクションフレームワークの続き

SE2で作ったリソースをSE3にコピーする

いずれやらないといけないので、さっさとコピーしておきましょう。

workspaceをコピーする。

Setで独自クラスManを使ってみる

add()とcontains()が期待通りに動作していない。

オブジェクトの同一性の判断をどうやっているかという問題。

Manクラスのテストケースを作成して同一性を保障できるようにする。

パッケージエクスプローラでMan.javaを右クリックし、ポップアップメニューで[新規]-[JUnitテストケース]を選択する。

新規JUnitテストケースのダイアログで「次へ」をクリックし、テストメソッドの中からhashCode()とequals()をチェックして「完了」をクリックする。

テストを作成する。

public class ManTest {

	@Test
	public void testHashCode() {
		Man m1 = new Man("孫", 10);
		Man m2 = new Man("孫", 10);
		assertThat(m1.hashCode(), is(m2.hashCode()));
	}

	@Test
	public void testEquals() {
		fail("まだ実装されていません");
	}

}

ManクラスにhashCode()メソッドのオーバーライドを作成する。

Eclipseのメニューバーで[ソース]-[メソッドのオーバーライド実装]を選択する。
「オーバーライドまたは実装するメソッドを選択」でhashCode()をチェックしてOKする。

4月1日

コレクションフレームワーク

List・Set・Mapの3つのインタフェースがある。

テキストの例題を入力して実行する。(p.422〜p.441)

  • 23-01 ListSample
  • 23-02 ListSample2
  • 23-03 ListSample3
  • 23-04 ListSample4
  • 23-05 ListSample5
  • 23-06 ListSample6
  • 23-07 SetSample
  • 23-08 SetSample2
  • 23-09 SetSample3

SetSampleでManを使ってみる。

import java.util.HashSet;
import java.util.Set;

public class SetSample4 {
    public static void main(String[] args) {
        Set set = new HashSet();
        set.add(new Man("孫", 10));
        set.add(new Man("北尾", 15));
        set.add(new Man("三木谷", 20));
        if (!set.add(new Man("孫", 10))) {
            System.out.println("孫は追加できない");
        }
        if (set.contains(new Man("孫", 10))) {
            System.out.println("孫はある");
        }
        for (Man m : set) {
            System.out.println(m.introduce());
        }
    }
}