モジュール java.base
パッケージ java.util

インタフェースComparator<T>

型パラメータ:
T - このコンパレータにより比較されるオブジェクトの型
既知のすべての実装クラス:
Collator, RuleBasedCollator
関数型インタフェース:
これは関数型インタフェースなので、ラムダ式またはメソッド参照の代入先として使用できます。

@FunctionalInterface public interface Comparator<T>
オブジェクトのコレクションで全体順序付けを行う比較関数です。 コンパレータ(Comparator)をソート・メソッド(Collections.sortArrays.sortなど)に渡すと、ソート順を正確に制御できます。 また、コンパレータは、特定のデータ構造の(「ソートされたセット」「ソートされたマップ」など)の順序を制御したり、「自然順序付け」を持たないオブジェクトのコレクションの順序を指定したりすることもできます。

要素セットSに対するコンパレータcによる順序付けは、S内のe1およびe2ごとにc.compare(e1, e2)==0のブール値がe1.equals(e2)と同じ場合のみ、「等しいと一貫性」と記述されます。

ソート・セット(またはソート・マップ)を順序付けするために、equalsと一貫性のない順序付けを行うことができるコンパレータを使う場合には注意が必要です。 明示的な比較子cを持つソート済セット(またはマップのソート)が、セットSから描画された要素(またはキー)とともに使用されているとします。 Scによる順序付けが等しいと矛盾する場合、ソートされたセット(またはマップのソート)は"strangely."を動作させます 特に、ソートされたセット(またはマップのソート)は、equalsの観点から定義されたセット(またはマップ)の一般契約に違反します。

たとえば、(a.equals(b)&& c.compare(a, b)!= 0)である2つの要素aおよびbをコンパレータcで空のTreeSetに追加すると仮定します。 abはツリー・セットの点から見て等価ではないため、2番目のaddオペレーションは、Set.addメソッドの仕様とは異なる場合でも、trueを返し、ツリー・セットのサイズは大きくなります。

ノート: コンパレータは、通常、java.io.Serializableも実装することをお薦めします。これは、直列化可能なデータ構造(TreeSetTreeMapなど)で順序付けメソッドとして使用できるためです。 データ構造が正常に直列化されるようにするには、コンパレータ(提供されている場合)に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(Object) method(s)で定義された等価関係であることを意味します:
     {(x, y) such that x.equals(y)}. 
つまり、強制的な順序が等号と一致する場合、equalsメソッドの等価関係によって定義される同等のクラスと、compareメソッドのquotientによって定義される同等のクラスは同じです。

Comparableとは異なり、コンパレータは等価関係の要件を保ちつつ、null引数の比較をオプションで許可できます。

このインタフェースは、Java Collections Frameworkのメンバーです。

導入されたバージョン:
1.2
関連項目: