|
Java プラットフォーム 1.2 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
オブジェクトのコレクションで「全体順序付け」を行う比較関数です。Comparator をソートメソッド (Collections.sort など) に渡すと、ソート順を正確に制御できます。また、Comparator を使用すると、TreeSet または TreeMap といったデータ構造の順序を制御できます。
Comparator c が要素のセット S で行う順序付けは、S のすべての e1 および e2 について (compare((Object)e1, (Object)e2)==0) が e1.equals((Object)e2) と同じ boolean 値を持つ場合にだけ equals との一貫性があることになります。
ソートセット (またはソートマップ) を順序付けするために、equals と一貫性のない順序付けを行うことができるコンパレータを使う場合には注意が必要です。明示的な Comparator c を持つソートセット (またはソートマップ) がセット S からの要素 (またはキー) と一緒に使われると仮定します。c によって S に課される順序付けが equals と一貫性がない場合、ソートセット (またはソートマップ) の動作は異常になります。特に、ソートセット (またはソートマップ) は、equals で定義されているセット (またはマップ) の汎用規約に違反します。
たとえば、(a.equals((Object)b) && c.compare((Object)a, (Object)b) != 0) である 2 つのキー a と b をコンパレータ c を持つソートセットに追加する場合、2 回目の add オペレーションは false を返し、ソートセットのサイズは増加しません。これは、a と b がソートセットの観点では同等だからです。
注: 通常は、コンパレータで java.io.Serializable を実装してください。その理由は、コンパレータを直列化可能データ構造 (TreeSet、TreeMap など) の中で順序付けメソッドとして使用できるからです。データ構造の直列化を成功させるためには、コンパレータ (提供される場合) は Serializable を実装する必要があります。
数学的には、指定されたコンパレータ c が指定されたオブジェクトのセット S に課す「全体順序」を定義する関係は次のようになります。
{(x, y) | c.compare((Object)x, (Object)y) <= 0}.この全体順序の「商」は次のとおりです。
{(x, y) | x.compareTo((Object)y) == 0}.compare の規約から、商が S での「等価関係」であり、自然順序付けが S での「全体順序」であるのは明らかです。c が S で行う順序付けが「equals との一貫性」があると言う場合、それは自然順序付けの商がオブジェクトの equals(Object) メソッドで定義された等価関係であることを意味します。
{(x, y) | x.equals((Object)y)}.
Comparable
,
Arrays.sort(Object[], Comparator)
,
TreeMap
,
TreeSet
,
SortedMap
,
SortedSet
,
Serializable
メソッドの概要 | |
int |
compare(Object o1,
Object o2)
順序付けのために 2 つの引数を比較します。 |
boolean |
equals(Object obj)
ほかのオブジェクトがこの Comparator と「等しい」かどうかを示します。 |
メソッドの詳細 |
public int compare(Object o1, Object o2)
実装者は、すべての x および y で sgn(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 がすべての z で sgn(compare(x, z))==sgn(compare(y, z)) を意味するようにしなければなりません。 (compare(x, y)==0) == (x.equals(y)) は厳密には要求されません。通常は、この条件に違反するコンパレータはこの事実を明確に示す必要があります。「注: このコンパレータは equals と一貫性のない順序付けを課します。」のように示してください。
public boolean equals(Object obj)
comp1.equals(comp2)
はすべてのオブジェクト参照 o1 および o2 で sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2)) を意味します。
通常、Object.equals(Object) は変更しない方が安全です。ただし、このメソッドを変更し、2 つの個別の Comparator が同じ順序付けを行うことをプログラムが判断できるようにすることで、パフォーマンスが向上する場合があります。
obj
- 比較対象の参照オブジェクトtrue
Object.equals(java.lang.Object)
,
Object.hashCode()
|
Java プラットフォーム 1.2 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |