T
- このコンパレータにより比較されるオブジェクトの型@FunctionalInterface 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)
順序付けのために2つの引数を比較します。
|
static <T,U extends Comparable<? super U>> |
comparing(Function<? super T,? extends U> keyExtractor)
|
static <T,U> Comparator<T> |
comparing(Function<? super T,? extends U> keyExtractor, Comparator<? super U> keyComparator)
|
static <T> Comparator<T> |
comparingDouble(ToDoubleFunction<? super T> keyExtractor)
型
T からdouble ソート・キーを抽出する関数を受け取り、そのソート・キーで比較するComparator<T> を返します。 |
static <T> Comparator<T> |
comparingInt(ToIntFunction<? super T> keyExtractor)
型
T からint ソート・キーを抽出する関数を受け取り、そのソート・キーで比較するComparator<T> を返します。 |
static <T> Comparator<T> |
comparingLong(ToLongFunction<? super T> keyExtractor)
型
T からlong ソート・キーを抽出する関数を受け取り、そのソート・キーで比較するComparator<T> を返します。 |
boolean |
equals(Object obj)
ほかのオブジェクトがこのコンパレータと「等しい」かどうかを示します。
|
static <T extends Comparable<? super T>> |
naturalOrder()
自然な順序で
Comparable オブジェクトを比較するコンパレータを返します。 |
static <T> Comparator<T> |
nullsFirst(Comparator<? super T> comparator)
null をnull以外より小さいとみなす、nullフレンドリのコンパレータを返します。 |
static <T> Comparator<T> |
nullsLast(Comparator<? super T> comparator)
null をnull以外より大きいとみなす、nullフレンドリのコンパレータを返します。 |
default Comparator<T> |
reversed()
このコンパレータの逆順を義務付けるコンパレータを返します。
|
static <T extends Comparable<? super T>> |
reverseOrder()
自然順序付けの逆を義務付けるコンパレータを返します。
|
default Comparator<T> |
thenComparing(Comparator<? super T> other)
辞書式順序コンパレータをもう一方のコンパレータとともに返します。
|
default <U extends Comparable<? super U>> |
thenComparing(Function<? super T,? extends U> keyExtractor)
Comparable ソート・キーを抽出する関数を含む辞書式順序コンパレータを返します。 |
default <U> Comparator<T> |
thenComparing(Function<? super T,? extends U> keyExtractor, Comparator<? super U> keyComparator)
指定された
Comparator で比較されるキーを抽出する関数を含む辞書式順序コンパレータを返します。 |
default Comparator<T> |
thenComparingDouble(ToDoubleFunction<? super T> keyExtractor)
double ソート・キーを抽出する関数を含む辞書式順序コンパレータを返します。 |
default Comparator<T> |
thenComparingInt(ToIntFunction<? super T> keyExtractor)
int ソート・キーを抽出する関数を含む辞書式順序コンパレータを返します。 |
default Comparator<T> |
thenComparingLong(ToLongFunction<? super T> keyExtractor)
long ソート・キーを抽出する関数を含む辞書式順序コンパレータを返します。 |
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()
default Comparator<T> reversed()
default Comparator<T> thenComparing(Comparator<? super T> other)
Comparator
で2つの要素が等しい(つまり、compare(a, b) == 0
)と見なされる場合は、other
を使ってその順序が決められます。
指定されたコンパレータが直列化可能の場合、返されるコンパレータも直列化可能になります。
String
のコレクションをまず長さに基づいてソートし、次に大文字と小文字を区別しない自然順序付けに基づいてソートするには、次のコードを使用してコンパレータを構成できます。
Comparator<String> cmp = Comparator.comparingInt(String::length)
.thenComparing(String.CASE_INSENSITIVE_ORDER);
other
- このコンパレータが等しい2つのオブジェクトを比較するときに使用されるもう一方のコンパレータ。NullPointerException
- 引数がnullである場合。default <U> Comparator<T> thenComparing(Function<? super T,? extends U> keyExtractor, Comparator<? super U> keyComparator)
Comparator
で比較されるキーを抽出する関数を含む辞書式順序コンパレータを返します。thenComparing(comparing(keyExtractor, cmp))
であるかのように動作します。U
- ソート・キーの型keyExtractor
- ソート・キーの抽出に使用される関数keyComparator
- ソート・キーの比較に使用されるComparator
NullPointerException
- どちらかの引数がnullである場合。comparing(Function, Comparator)
, thenComparing(Comparator)
default <U extends Comparable<? super U>> Comparator<T> thenComparing(Function<? super T,? extends U> keyExtractor)
Comparable
ソート・キーを抽出する関数を含む辞書式順序コンパレータを返します。thenComparing(comparing(keyExtractor))
であるかのように動作します。U
- Comparable
ソート・キーの型keyExtractor
- Comparable
ソート・キーの抽出に使用される関数Comparable
ソート・キーで構成される辞書式順序コンパレータ。NullPointerException
- 引数がnullである場合。comparing(Function)
, thenComparing(Comparator)
default Comparator<T> thenComparingInt(ToIntFunction<? super T> keyExtractor)
int
ソート・キーを抽出する関数を含む辞書式順序コンパレータを返します。thenComparing(comparingInt(keyExtractor))
であるかのように動作します。keyExtractor
- 整数のソート・キーの抽出に使用される関数int
ソート・キーで構成される辞書式順序コンパレータNullPointerException
- 引数がnullである場合。comparingInt(ToIntFunction)
, thenComparing(Comparator)
default Comparator<T> thenComparingLong(ToLongFunction<? super T> keyExtractor)
long
ソート・キーを抽出する関数を含む辞書式順序コンパレータを返します。thenComparing(comparingLong(keyExtractor))
であるかのように動作します。keyExtractor
- longのソート・キーの抽出に使用される関数long
ソート・キーで構成される辞書式順序コンパレータNullPointerException
- 引数がnullである場合。comparingLong(ToLongFunction)
, thenComparing(Comparator)
default Comparator<T> thenComparingDouble(ToDoubleFunction<? super T> keyExtractor)
double
ソート・キーを抽出する関数を含む辞書式順序コンパレータを返します。thenComparing(comparingDouble(keyExtractor))
であるかのように動作します。keyExtractor
- doubleのソート・キーの抽出に使用される関数double
ソート・キーで構成される辞書式順序コンパレータNullPointerException
- 引数がnullである場合。comparingDouble(ToDoubleFunction)
, thenComparing(Comparator)
static <T extends Comparable<? super T>> Comparator<T> reverseOrder()
返されるコンパレータは直列化可能であり、null
を比較した場合にNullPointerException
をスローします。
T
- 比較対象の要素のComparable
型Comparable
オブジェクトに自然順序付けの逆を義務付けるコンパレータ。Comparable
static <T extends Comparable<? super T>> Comparator<T> naturalOrder()
Comparable
オブジェクトを比較するコンパレータを返します。
返されるコンパレータは直列化可能であり、null
を比較した場合にNullPointerException
をスローします。
T
- 比較対象の要素のComparable
型Comparable
オブジェクトに自然順序付けを義務付けるコンパレータ。Comparable
static <T> Comparator<T> nullsFirst(Comparator<? super T> comparator)
null
をnull以外より小さいとみなす、nullフレンドリのコンパレータを返します。両方ともnull
である場合、それらは等しいと見なされます。両方ともnull以外である場合、指定されたComparator
を使ってその順序が決められます。指定されたコンパレータがnull
である場合、返されるコンパレータはnull以外のすべての値が等しいと見なします。
指定されたコンパレータが直列化可能の場合、返されるコンパレータも直列化可能になります。
T
- 比較対象の要素の型comparator
- null以外の値を比較するためのComparator
null
をnull以外よりも小さいと見なし、指定されたComparator
を使ってnull以外のオブジェクトを比較します。static <T> Comparator<T> nullsLast(Comparator<? super T> comparator)
null
をnull以外より大きいとみなす、nullフレンドリのコンパレータを返します。両方ともnull
である場合、それらは等しいと見なされます。両方ともnull以外である場合、指定されたComparator
を使ってその順序が決められます。指定されたコンパレータがnull
である場合、返されるコンパレータはnull以外のすべての値が等しいと見なします。
指定されたコンパレータが直列化可能の場合、返されるコンパレータも直列化可能になります。
T
- 比較対象の要素の型comparator
- null以外の値を比較するためのComparator
null
をnull以外よりも大きいと見なし、指定されたComparator
を使ってnull以外のオブジェクトを比較します。static <T,U> Comparator<T> comparing(Function<? super T,? extends U> keyExtractor, Comparator<? super U> keyComparator)
T
からソート・キーを抽出する関数を受け取り、指定されたComparator
を使ってそのソート・キーで比較するComparator<T>
を返します。
指定された関数とコンパレータの両方が直列化可能の場合、返されるコンパレータも直列化可能になります。
Person
オブジェクトをその姓(大文字小文字の区別を無視して)で比較するComparator
を取得するには、
Comparator<Person> cmp = Comparator.comparing(
Person::getLastName,
String.CASE_INSENSITIVE_ORDER);
T
- 比較対象の要素の型U
- ソート・キーの型keyExtractor
- ソート・キーの抽出に使用される関数keyComparator
- ソート・キーの比較に使用されるComparator
Comparator
を使用して、抽出されたキーで比較を行うコンパレータNullPointerException
- どちらかの引数がnullの場合static <T,U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T,? extends U> keyExtractor)
T
からComparable
ソート・キーを抽出する関数を受け取り、そのソート・キーで比較するComparator<T>
を返します。
指定された関数が直列化可能の場合、返されるコンパレータも直列化可能になります。
Person
オブジェクトをその姓で比較するComparator
を取得するには、
Comparator<Person> byLastName = Comparator.comparing(Person::getLastName);
T
- 比較対象の要素の型U
- Comparable
ソート・キーの型keyExtractor
- Comparable
ソート・キーの抽出に使用される関数NullPointerException
- 引数がnullの場合static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor)
T
からint
ソート・キーを抽出する関数を受け取り、そのソート・キーで比較するComparator<T>
を返します。
指定された関数が直列化可能の場合、返されるコンパレータも直列化可能になります。
T
- 比較対象の要素の型keyExtractor
- 整数のソート・キーの抽出に使用される関数NullPointerException
- 引数がnullの場合comparing(Function)
static <T> Comparator<T> comparingLong(ToLongFunction<? super T> keyExtractor)
T
からlong
ソート・キーを抽出する関数を受け取り、そのソート・キーで比較するComparator<T>
を返します。
指定された関数が直列化可能の場合、返されるコンパレータも直列化可能になります。
T
- 比較対象の要素の型keyExtractor
- longのソート・キーの抽出に使用される関数NullPointerException
- 引数がnullの場合comparing(Function)
static <T> Comparator<T> comparingDouble(ToDoubleFunction<? super T> keyExtractor)
T
からdouble
ソート・キーを抽出する関数を受け取り、そのソート・キーで比較するComparator<T>
を返します。
指定された関数が直列化可能の場合、返されるコンパレータも直列化可能になります。
T
- 比較対象の要素の型keyExtractor
- doubleのソート・キーの抽出に使用される関数NullPointerException
- 引数がnullの場合comparing(Function)
バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.