|
Foundation 1.1.2 | |||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
public interface 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 つのキー a と b をコンパレータ c を持つソートセットに追加する場合、2 回目の add オペレーションは false を返し、ソートセットのサイズは増加しません。これは、a と b がソートセットの観点では同等だからです。
注:通常は、コンパレータで java.io.Serializable も実装してください。その理由は、コンパレータを直列化可能データ構造 (TreeSet、TreeMap など) の中で順序付けメソッドとして使用できるからです。データ構造の直列化を成功させるためには、コンパレータ (提供される場合) は 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 での「全体順序」であるのは明らかです。c が S で行う順序付けが「equals との一貫性」があると言う場合、それは自然順序付けの商がオブジェクトの equals(Object) メソッドで定義された等価関係であることを意味します。
{(x, y) such that x.equals((Object)y)}.
このインタフェースは、Java Collections Framework のメンバーです。
Comparable
,
Arrays.sort(Object[], Comparator)
,
TreeMap
,
TreeSet
,
SortedMap
,
SortedSet
,
Serializable
メソッドの概要 | |
---|---|
int |
compare(Object o1,
Object o2)
順序付けのために 2 つの引数を比較します。 |
boolean |
equals(Object obj)
ほかのオブジェクトがこの Comparator と「等しい」かどうかを示します。 |
メソッドの詳細 |
---|
int compare(Object o1, Object o2)
実装では、すべての x と y に対して sgn(compare(x, y)) == -sgn(compare(y, x)) が保証されなければいけません。実装は、すべての x および y で sgn(compare(x, y)) == -sgn(compare(y, x)) を保証しなければいけません。
また、実装者は、この関係に推移性を持たせる必要があります。すなわち、((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 と一貫性のない順序付けを課します。」のように示してください。
o1
- 比較対象の最初のオブジェクトo2
- 比較対象の 2 番目のオブジェクト
ClassCastException
- 引数の型がこのコンパレータによる比較を妨げる場合boolean equals(Object obj)
comp1.equals(comp2)
はすべてのオブジェクト参照 o1 および o2 で sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2)) を意味します。通常、Object.equals(Object) は変更しないほうが安全です。ただし、このメソッドを変更し、2 つの個別の Comparator が同じ順序付けを行うことをプログラムが判断できるようにすることで、パフォーマンスが向上する場合があります。
Object
内の equals
obj
- 比較対象の参照オブジェクト
true
Object.equals(java.lang.Object)
,
Object.hashCode()
|
Foundation 1.1.2 | |||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。