T
- このオブジェクトが比較されるオブジェクトの型public interface Comparable<T>
このインタフェースを実装するオブジェクトのリスト (および配列) は、Collections.sort
(および Arrays.sort
) によって自動的にソートできます。このインタフェースを実装するオブジェクトはソートマップのキーとして使用したり、ソートセットの要素として使用したりできますが、その際に、コンパレータを指定する必要はありません。
クラス C の自然順序付けが equals と一貫性があると言われるのは、クラス C のすべての e1 と e2 について、e1.compareTo(e2) == 0 と e1.equals(e2) の boolean 値が同じになる場合だけです。null はいずれのクラスのインスタンスでもないため、e.equals(null) が false を返す場合でも e.compareTo(null) は NullPointerException をスローすべきです。
自然順序付けでは、equals と一貫性があることは、必須ではありませんが強く推奨されます。これは、明示的なコンパレータを指定しないソートセットやソートマップを、自然順序付けが equals と一貫性のない要素またはキーと一緒に使用すると、セットとマップの動作が保証されなくなるからです。特に、このようなソートセットまたはソートマップは、セットまたはマップの一般的な規約に違反します。この規約は、equals メソッドの用語を用いて定義されています。
たとえば、(!a.equals(b) && a.compareTo(b) == 0) となるような 2 つのキー a と b を、明示的なコンパレータを使用しないソートセットに追加する場合、2 つ目の追加操作では false が返され、ソートセットのサイズは増えません。これは、ソートセットから見ると a と b は等価であるためです。
Comparable を実装するほとんどの Java コアクラスは、equals と一貫性のある自然順序付けを持ちます。1 つの例外は java.math.BigDecimal です。このクラスの自然順序付けでは、異なる精度の同じ値 (4.0 と 4.00 など) を持つ BigDecimal オブジェクトは等価と見なされます。
数学的には、任意のクラス C に対して自然順序付けを定義する順序関係は次のようになります。
{(x, y) such that x.compareTo(y) <= 0}.この全体順序の商は次のとおりです。
{(x, y) such that x.compareTo(y) == 0}.compareTo の規約から判断して、商が C で同値関係にあり、自然順序付けが C の全体順序であるということは明らかです。クラスの自然順序付けが equals と一貫性があるということは、自然順序付けの商がクラスの次の
equals(Object)
メソッドで定義される同値関係になることを意味します。{(x, y) such that x.equals(y)}.
このインタフェースは、Java Collections Framework のメンバーです。
Comparator
int compareTo(T o)
実装では、すべての x と y に対して sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) が保証されなければいけません。これは、y.compareTo(x) が例外をスローする場合は x.compareTo(y) も例外をスローすることを意味します。
実装では、順序関係が推移的であることも保証されなければいけません。(x.compareTo(y)>0 && y.compareTo(z)>0) は x.compareTo(z)>0 を意味します。
さらに、すべての z に対して x.compareTo(y)==0 が sgn(x.compareTo(z)) == sgn(y.compareTo(z)) を意味することも保証されなければいけません。
必須というわけではありませんが、(x.compareTo(y)==0) == (x.equals(y)) であることが強く推奨されます。一般に、Comparable インタフェースを実装しているクラスで、この条件に違反するクラスはすべて、明確にこの事実を示す必要があります。「注:このクラスは equals と一貫性のない自然順序付けを持ちます」などと明示することをお勧めします。
前述の説明では、sgn(expression) という表記は数学関数 signum を示し、expression の値 (負の数、ゼロ、正の数) に応じて、-1、0、1 のどれかを返します。
o
-比較対象のオブジェクト。NullPointerException
- 指定されたオブジェクトが null の場合ClassCastException
- 指定されたオブジェクトの型が原因で、このオブジェクトと比較できない場合 バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.