JavaTM 2
Platform
Std. Ed. v1.4.0

java.util
インタフェース Comparator

既知の実装クラスの一覧:
Collator

public interface Comparator

オブジェクトのコレクションで「全体順序付け」を行う比較関数です。コンパレータ (Comparator) をソートメソッド (Collections.sort など) に渡すと、ソート順を正確に制御できます。また、コンパレータを使用すると、TreeSet または TreeMap といったデータ構造の順序を制御できます。

コンパレータ c が要素のセット S で行う順序付けは、S のすべての e1 および e2 について (compare((Object)e1, (Object)e2)==0)e1.equals((Object)e2) と同じ boolean 値を持つ場合にだけ equals との一貫性があることになります。

ソートセット (またはソートマップ) を順序付けするために、equals と一貫性のない順序付けを行うことができるコンパレータを使う場合には注意が必要です。明示的な コンパレータ c を持つソートセット (またはソートマップ) がセット S からの要素 (またはキー) と一緒に使われると仮定します。c によって S に課される順序付けが equals と一貫性がない場合、ソートセット (またはソートマップ) の動作は異常になります。特に、ソートセット (またはソートマップ) は、equals で定義されているセット (またはマップ) の一般規約に違反します。

たとえば、(a.equals((Object)b) && c.compare((Object)a, (Object)b) != 0) である 2 つのキー ab をコンパレータ c を持つソートセットに追加する場合、2 回目の add オペレーションは false を返し、ソートセットのサイズは増加しません。これは、ab がソートセットの観点では同等だからです。

注: 通常は、コンパレータで java.io.Serializable を実装してください。その理由は、コンパレータを直列化可能データ構造 (TreeSetTreeMap など) の中で順序付けメソッドとして使用できるからです。データ構造の直列化を成功させるためには、コンパレータ (提供される場合) は Serializable を実装する必要があります。

数学的には、指定されたコンパレータ c が指定されたオブジェクトのセット S に課す「全体順序」を定義する関係は次のようになります。

       {(x, y) such that c.compare((Object)x, (Object)y) <= 0}.
この全体順序の「商」は次のとおりです。
       {(x, y) such that c.compare((Object)x, (Object)y) == 0}.
compare の規約から、商が S での「等価関係」であり、自然順序付けが S での「全体順序」であるのは明らかです。cS で行う順序付けが「equals との一貫性」があると言う場合、それは自然順序付けの商がオブジェクトの equals(Object) メソッドで定義された等価関係であることを意味します。
       {(x, y) such that x.equals((Object)y)}.

導入されたバージョン:
1.2
関連項目:
Comparable, Arrays.sort(Object[], Comparator), TreeMap, TreeSet, SortedMap, SortedSet, Serializable

メソッドの概要
 int compare(Object o1, Object o2)
          順序付けのために 2 つの引数を比較します。
 boolean equals(Object obj)
          ほかのオブジェクトがこのコンパレータと「等しい」かどうかを示します。
 

メソッドの詳細

compare

public int compare(Object o1,
                   Object o2)
順序付けのために 2 つの引数を比較します。最初の引数が 2 番目の引数より小さい場合は負の整数、両方が等しい場合は 0、最初の引数が 2 番目の引数より大きい場合は正の整数を返します。

実装は、すべての x および ysgn(compare(x, y)) == -sgn(compare(y, x)) を保証しなければなりません。これは、compare(y, x) が例外をスローする場合にだけ compare(x, y) が例外をスローすることを意味します。

また、実装者は、この関係に推移性を持たせる必要があります。すなわち、((compare(x, y)>0) && (compare(y, z)>0))compare(x, z)>0 を意味します。

最後に、実装者は、compare(x, y)==0 がすべての zsgn(compare(x, z))==sgn(compare(y, z)) を意味するようにしなければなりません。

(compare(x, y)==0) == (x.equals(y)) は厳密には要求されません。通常は、この条件に違反するコンパレータではこの事実が明確に示される必要があります。「注: このコンパレータは equals と一貫性のない順序付けを課します。」のように示してください。

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

equals

public boolean equals(Object obj)
ほかのオブジェクトがこのコンパレータと「等しい」かどうかを示します。このメソッドは、Object.equals(Object) の一般規約に従う必要があります。また、このメソッドは、指定された Object もコンパレータであり、それがこのコンパレータと同じ順序付けを行う場合にだけ true を返すことができます。したがって、comp1.equals(comp2) はすべてのオブジェクト参照 o1 および o2sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2)) を意味します。

通常Object.equals(Object) は変更しないほうが安全です。ただし、このメソッドを変更し、2 つの個別のコンパレータが同じ順序付けを行うことをプログラムが判断できるようにすることで、パフォーマンスが向上する場合があります。

オーバーライド:
クラス Object 内の equals
パラメータ:
obj - 比較対象の参照オブジェクト
戻り値:
指定されたオブジェクトもコンパレータであり、それがこのコンパレータと同じ順序付けを行う場合にだけ true
関連項目:
Object.equals(java.lang.Object), Object.hashCode()

JavaTM 2
Platform
Std. Ed. v1.4.0

バグの報告と機能のリクエスト
これ以外の API リファレンスおよび開発者用ドキュメントについては、 Java 2 SDK SE 開発者用ドキュメントを参照してください。 開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、 およびコード実例が含まれています。

Java、Java 2D、および JDBC は米国ならびにその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-2002 Sun Microsystems, Inc. 901 San Antonio Road
Palo Alto, California, 94303, U.S.A. All Rights Reserved.