ComparableとComparatorの両方を実装するクラスを見てきました。これは何を意味するのでしょうか?なぜ一方を他方で使用するのですか?
ComparableとComparatorの両方を実装するクラスを見てきました。これは何を意味するのでしょうか?なぜ一方を他方で使用するのですか?
回答:
以下のテキストは、比較対比較可能です
同程度の
比較可能なオブジェクトは、それ自体を別のオブジェクトと比較することができます。クラス自体は、java.lang.Comparable
そのインスタンスを比較できるようにするために、インターフェースを実装する必要があります。
コンパレータ
コンパレータオブジェクトは、2つの異なるオブジェクトを比較できます。クラスはそのインスタンスを比較していませんが、他のいくつかのクラスのインスタンスを比較しています。このコンパレータクラスは、java.util.Comparator
インターフェイスを実装する必要があります。
実装とComparable
は、「自分を別のオブジェクトと比較できること」を意味します。これは通常、単一の自然なデフォルト比較がある場合に役立ちます。
実装とComparator
は、「他の2つのオブジェクトを比較できること」を意味します。これは通常、型の2つのインスタンスを比較する方法が複数ある場合に便利です。たとえば、年齢、名前などで人を比較できます。
Person
implement を作成するだけでは実行できません。2人の比較方法Comparable
を変更することはできないためです。
Person
。2)コンパレータ。たとえば、PersonAgeComparator
2つの異なるエンティティを比較し、特定のソート順で最初に来るエンティティを決定できます。3)エンティティのコレクションとコンパレーターを受け取り、コンパレーターを使用してそのコレクションをソートして、順序を決定するソートコード。
Comparableにより、クラスは独自の比較を実装できます。
比較すると、コンパレータは外部比較です。
どちらの実装でも、比較対象を選択できます。ジェネリックスを使用すると、そのように宣言して、コンパイル時にチェックすることができます。これにより安全性が向上しますが、適切な値を決定することも課題です。
ガイドラインとして、私は通常、そのオブジェクトを比較できる最も一般的なクラスまたはインターフェイスを使用します。想定するすべてのユースケースで...定義はそれほど正確ではありませんが!:-(
Comparable<Object>
コンパイル時にすべてのコードでそれを使用できるようにします(必要な場合はこれで十分であり、そうでない場合は不良であり、コンパイル時のエラーが発生します)。実装はオブジェクトに対処し、必要に応じて堅牢な方法でキャストする必要があります。Comparable<Itself>
逆に非常に厳しいです。おもしろいことに、それ自体をサブクラスにサブクラス化する場合、サブクラスも比較可能であり、それに対して堅牢でなければなりません(そうしないと、リスコフの原則が破られ、実行時エラーが発生します)。
java.lang.Comparable
Comparable
インターフェイスを実装するには、クラスは単一のメソッドを実装する必要がありますcompareTo()
int a.compareTo(b)
インスタンスをソートするクラスを変更する必要があります。したがって、クラスごとに1つの分類順序しか作成できません。
java.util.Comparator
コンパレータインターフェイスを実装するには、クラスは単一のメソッドを実装する必要があります compare()
int compare (a,b)
Comparable
通常は推奨されます。ただし、クラスがすでにを実装していることComparable
がありますが、別のプロパティでソートしたい場合があります。次に、使用を余儀なくされますComparator
。
一部のクラスは実際Comparators
に一般的なケースを提供します。たとえば、String
sがデフォルトの大文字と小文字を区別しソートでですが、静的もありますComparator
呼ばれるがCASE_INSENSITIVE_ORDER
。
ここに私がウェブで見つけたコンパレータと比較可能なものの間のいくつかの違いがあります:
あなたが見るなら、これらの2つの間の論理的な違いは、Javaのコンパレータが彼に提供された2つのオブジェクトを比較するのに対し、Comparableインターフェースは「this」参照を指定されたオブジェクトと比較することです。
JavaのComparableは、オブジェクトの自然な順序付けを実装するために使用されます。Java API文字列では、DateクラスとラッパークラスがComparableインターフェースを実装します。
クラスがJavaでComparableインターフェースを実装している場合、ListまたはArrayのいずれかのオブジェクトのコレクションは、Collections.sort()またはArray.sort()メソッドを使用して自動的にソートでき、オブジェクトはCompareToメソッドで定義された自然な順序に基づいてソートされます。
JavaでComparableを実装するオブジェクトは、コンパレータを指定せずに、ソート済みマップのキーまたはTreeSetなどのソート済みセットの要素として使用できます。
site:JavaでComparatorとComparableを使用する方法 例で
Comparable
自然な順序のオブジェクト用です。オブジェクト自体は、それがどのように順序付けられるかを知っています。
Comparator
自然な順序付けのないオブジェクト、または別の順序付けを使用する場合に使用します。
コンパレータと比較可能なインターフェースの違い
Comparable
別のオブジェクトと使用して自身を比較するために使用されます。
Comparator
オブジェクトである2つのデータ型を比較するために使用されます。
あなたが見るならば、これらの2つの間の論理的な違いはComparator
Javaで彼に提供された2つのオブジェクトを比較する一方で、Comparable
インターフェースは「this」参照を指定されたオブジェクトと比較します。
Comparable
Javaでは、オブジェクトの自然な順序付けを実装するために使用されます。Java API文字列では、DateクラスとラッパークラスがComparable
インターフェイスを実装します。
どのクラスが実装する場合Comparable
、Javaのインターフェイスを、そのオブジェクトのコレクションのいずれかList
またはArray
使用することによって、自動的にソートすることができるCollections.sort()
か、Array.sort()
方法及びオブジェクトは、で定義されてそこに自然な順序に基づいてソートされますcompareTo
方法。
Comparable
たとえばTreeSet
、Java で実装するオブジェクトは、何も指定せずに、ソート済みマップのキーまたはソート済みセットの要素として使用できますComparator
。
ComparableおよびComparatorを実装するための私の注釈ライブラリ:
public class Person implements Comparable<Person> {
private String firstName;
private String lastName;
private int age;
private char gentle;
@Override
@CompaProperties({ @CompaProperty(property = "lastName"),
@CompaProperty(property = "age", order = Order.DSC) })
public int compareTo(Person person) {
return Compamatic.doComparasion(this, person);
}
}
リンクをクリックすると、他の例が表示されます。相応の