目次へ

3.2. java.lang.Comparable, java.util.Comparator

次節で説明する「TreeSet」は「HashSet」を拡張したクラスで、値を順序付けて保存するという特徴があります。この節では順序付けに必要な、オブジェクトの比較について説明します。

Javaでオブジェクトの比較をするには2通りの方法があります。1つは比較をしたいクラス自身が「java.lang.Comparable」インタフェースを実装する方法で、もう1つは「java.util.Comparator」インタフェースを実装した比較専門のクラスを作成する方法です。

前者の方法について説明します。「Comparable」インタフェースで定義されているメソッドは「compareTo(Object)」のみで、比較はこのメソッドによって行われます。メソッドが呼び出されたオブジェクトと引数で指定されたオブジェクトの間で比較が行われ、比較の結果がメソッドの返り値として返されます。返り値が正の整数である場合には、オブジェクトが引数に指定したオブジェクトよりも大きい事を意味し、負の整数の場合は小さい事、「0」である場合には同じである事を意味します。また「Object」の「equals」メソッドが「true」を返す条件と、「compareTo」が「0」を返す条件は同じである事が推奨されています。以下は「compareTo」メソッドの使用例です。

System.out.println(new String("japan").compareTo(new String("america")));
System.out.println(new String("china").compareTo(new String("japan")));

「String」は辞書式に文字列を比較するので、それに応じた結果を返します。上の例では、1行目は正の整数、2行目は負の整数を返します。

独自に「Comparable」インタフェースを実装する場合には、比較方法を決定して「compareTo」メソッドの中に実装する事となります。

続いて「Comparator」について説明します。このインタフェースで定義されているメソッドは以下の通りで、「compare(Object, Object)」で比較が実行されます。

int compare(Object, Object) 第1引数で指定したオブジェクトが、第2引数で指定したオブジェクトよりも大きい場合は正の整数、同じ場合は0、小さい場合は負の整数を返します。
boolean equals(Object) 引数で指定されたオブジェクトが、この「Comparator」オブジェクトと等しい場合に「true」を返します。

「Comparable」の「compareTo」と「Comparator」の「compare」の定義は、後者が引数を2つ持つ事を除いてほぼ同じで、比較結果に応じて「正の整数」「0」「負の整数」を返すようにします。「Comparable」と同じく、「0」を返す条件は「equals」メソッドが「true」を返す条件と同じにする事が推奨されています。

(実習課題2)

以下のコンソールプログラムを作成しなさい。

  • 実習課題1で作成した人間を表すクラスに、「Comparable」インタフェースの実装および「Object」の「equals」「hashCode」メソッドのオーバーライドを行う事。比較方法は任意でよい。
  • 3つ以上、上記クラスのインスタンスを作成し、「compareTo」「equals」メソッドで比較した結果を表示する事。
  • またそれぞれのハッシュ値を表示する事。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp