T
- このコンパレータにより比較されるオブジェクトの型public interface Comparator<T>
Collections.sort
や Arrays.sort
など) に渡すと、ソート順を正確に制御できます。また、コンパレータを使用すると、sorted sets
(ソートセット) や sorted maps
(ソートマップ) などの特定のデータ構造の順序を制御したり、natural ordering
(自然順序付け) を持たないオブジェクトのコレクションに順序付けを提供したりすることもできます。コンパレータ 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}.この全体順序の商は次のとおりです。
{(x, y) such that c.compare(x, y) == 0}.compare の規約から、商が S での等価関係であり、強制的な順序付けが S での全体順序であるのは明らかです。c が S で行う順序付けがequals との一貫性があるという場合、それは順序付けの商がオブジェクトの
equals(Object)
メソッドで定義された等価関係であることを意味します。{(x, y) such that x.equals(y)}.
Comparable
とは異なり、コンパレータは等価関係の要件を保ちつつ、null 引数の比較をオプションで許可できます。
このインタフェースは、Java Collections Framework のメンバーです。
Comparable
, Serializable
int compare(T o1, T o2)
前述の説明では、sgn(expression) という表記は数学関数 signum を示し、expression の値 (負の数、ゼロ、正の数) に応じて、-1、0、1 のどれかを返します。
実装では、すべての 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 と一貫性のない順序付けを課します。」のように示してください。
o1
- 比較対象の最初のオブジェクト。o2
- 比較対象の 2 番目のオブジェクト。NullPointerException
- 引数が null で、このコンパレータが null 引数を許可しない場合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 つの個別のコンパレータが同じ順序付けを行うことをプログラムが判断できるようにすることで、パフォーマンスが向上する場合があります。
equals
、クラス: Object
obj
- 比較対象の参照オブジェクト。true
。Object.equals(Object)
, Object.hashCode()
バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.