|
JavaTM Platform Standard Ed. 6 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
T - このコンパレータにより比較されるオブジェクトの型public interface Comparator<T>
オブジェクトのコレクションで「全体順序付け」を行う比較関数です。コンパレータ (Comparator) をソートメソッド (Collections.sort や Arrays.sort など) に渡すと、ソート順を正確に制御できます。また、コンパレータを使用すると、ソートセットやソートマップなどの特定のデータ構造の順序を制御したり、自然順序付けを持たないオブジェクトのコレクションに順序付けを提供したりすることもできます。
コンパレータ c が要素のセット S で行う順序付けは、S のすべての e1 および e2 について c.compare(e1, e2)==0 が e1.equals(e2) と同じ boolean 値を持つ場合にだけ equals との一貫性があることになります。
ソートセット (またはソートマップ) を順序付けするために、equals と一貫性のない順序付けを行うことができるコンパレータを使う場合には注意が必要です。明示的なコンパレータ c を持つソートセット (またはソートマップ) がセット S からの要素 (またはキー) と一緒に使われると仮定します。c によって S に課される順序付けが equals と一貫性がない場合、ソートセット (またはソートマップ) の動作は異常になります。特に、ソートセット (またはソートマップ) は、equals で定義されているセット (またはマップ) の一般規約に違反します。
たとえば、(a.equals(b) && c.compare(a, b) != 0) である 2 つの要素 a および b をコンパレータ c で空の TreeSet に追加すると仮定します。a と b はツリーセットの点から見て等価ではないため、2 番目の add オペレーションは、Set.add メソッドの仕様とは異なる場合でも、true を返し、ツリーセットのサイズは大きくなります。
注:通常は、コンパレータで java.io.Serializable も実装してください。その理由は、コンパレータを直列化可能データ構造 (TreeSet、TreeMap など) の中で順序付けメソッドとして使用できるからです。データ構造の直列化を成功させるためには、コンパレータ (提供される場合) は Serializable を実装する必要があります。
数学的には、指定されたコンパレータ c が指定されたオブジェクトのセット S に課す強制的な順序付けを定義する関係は次のようになります。
{(x, y) such that c.compare(x, y) <= 0}.
この全体順序の quotient は次のようになります。
{(x, y) such that c.compare(x, y) == 0}.
compare の規約から、商が S での「等価関係」であり、強制的な順序付けが S での「全体順序」であるのは明らかです。c が S で行う順序付けが「equals との一貫性」があると言う場合、それは順序付けの商がオブジェクトの equals(Object) メソッドで定義された等価関係であることを意味します。
{(x, y) such that x.equals(y)}. このインタフェースは、Java Collections Framework のメンバーです。
Comparable,
Serializable| メソッドの概要 | |
|---|---|
int |
compare(T o1,
T o2)
順序付けのために 2 つの引数を比較します。 |
boolean |
equals(Object obj)
ほかのオブジェクトがこのコンパレータと「等しい」かどうかを示します。 |
| メソッドの詳細 |
|---|
int compare(T o1,
T o2)
前述の説明では、sgn(expression) という表記は数学関数 signum 関数を示し、expression の値 (負の数、ゼロ、正の数) に応じて、-1、0、1 のどれかを返します。
実装では、すべての 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)
Object.equals(Object) の一般規約に従う必要があります。また、このメソッドは、指定されたオブジェクトもコンパレータであり、それがこのコンパレータと同じ順序付けを行う場合にだけ true を返すことができます。したがって、comp1.equals(comp2) はすべてのオブジェクト参照 o1 および o2 で sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2)) を意味します。通常、Object.equals(Object) は変更しないほうが安全です。ただし、このメソッドを変更し、2 つの個別のコンパレータが同じ順序付けを行うことをプログラムが判断できるようにすることで、パフォーマンスが向上する場合があります。
Object 内の equalsobj - 比較対象の参照オブジェクト
trueObject.equals(Object),
Object.hashCode()
|
JavaTM Platform Standard Ed. 6 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。