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)
このオブジェクトと指定されたオブジェクトの順序を比較します。
|
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, 2020, Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. Documentation Redistribution Policyも参照してください。