ComparableとComparatorの両方を実装するクラスを見てきました。これは何を意味するのでしょうか?なぜ私は一方をもう一方の上に使用するのですか?
以下のテキストは Comparator vs Comparable
比較可能
比較可能なオブジェクトは、それ自体を別のオブジェクトと比較できます。インスタンスを比較するには、クラス自体がJava.lang.Comparable
インターフェイスを実装する必要があります。
コンパレータ
コンパレータオブジェクトは、2つの異なるオブジェクトを比較できます。クラスはインスタンスを比較していませんが、他のクラスのインスタンスを比較しています。このコンパレータクラスは、Java.util.Comparator
インターフェイスを実装する必要があります。
Comparable
の実装は、「自分を別のオブジェクトと比較できます。」を意味します。これは、単一の自然なデフォルト比較がある場合に通常役立ちます。
Comparator
の実装は、「他の2つのオブジェクトを比較できます。」を意味します。これは通常、2つのタイプのインスタンスを比較する方法が複数ある場合に役立ちます。年齢、名前などで人を比較できます.
Comparableにより、クラスは独自の比較を実装できます。
比較すると、Comparatorは外部比較です。
どちらの実装でも、まだ比較するものを選択できます。ジェネリックを使用すると、宣言して、コンパイル時にチェックすることができます。これにより安全性が向上しますが、適切な値を決定することも課題です。
ガイドラインとして、私は一般に、そのオブジェクトを比較できる最も一般的なクラスまたはインターフェースを使用しますが、私が想定するすべてのユースケースで...定義はあまり正確ではありません! :-(
Comparable<Object>
を使用すると、コンパイル時にすべてのコードで使用できます(必要な場合は適切ですが、必要でない場合は無効であり、コンパイル時エラーが発生しません)。実装はオブジェクトに対処し、必要に応じて堅牢な方法でキャストする必要があります。Comparable<Itself>
は非常に厳密です。面白いことに、サブクラスをサブクラスにサブクラス化するとき、サブクラスも比較可能であり、堅牢である必要があります(または、リスコフの原理を破り、実行時エラーが発生します)。
Java.lang.Comparable
Comparable
インターフェイスを実装するには、クラスは単一のメソッドcompareTo()
を実装する必要があります
int a.compareTo(b)
インスタンスをソートするクラスを変更する必要があります。したがって、クラスごとに作成できるソートシーケンスは1つだけです。
Java.util.Comparator
Comparatorインターフェースを実装するには、クラスは単一のメソッドcompare()
を実装する必要があります
int compare (a,b)
Comparable
は、データオブジェクトに自然な順序がある場合など、データオブジェクトのデフォルトの順序を提供するためのものです。
Comparator
は、特定の用途の順序自体を表します。
通常、Comparable
が推奨されます。ただし、クラスがすでにComparable
を実装している場合がありますが、別のプロパティでソートしたい場合があります。次に、Comparator
を使用する必要があります。
一部のクラスは、実際に一般的な場合にComparators
を提供します。たとえば、 String
sはデフォルトでソート時に大文字と小文字を区別しますが、 CASE_INSENSITIVE_ORDER
と呼ばれる静的なComparator
もあります。
以下は、Webで見つけたComparatorとComparableの違いです。
これら2つの間の論理的な違いは、JavaのComparatorが提供された2つのオブジェクトを比較し、Comparableインターフェイスが「this」参照を指定されたオブジェクトと比較することです。
JavaのComparableは、オブジェクトの自然な順序付けを実装するために使用されます。 Java API文字列では、DateクラスとラッパークラスがComparableインターフェイスを実装します。
クラスがJavaのComparableインターフェースを実装している場合、そのオブジェクトのコレクションは、Collections.sort()またはArray.sort()メソッドを使用して自動的にソートでき、オブジェクトはそこに基づいてソートされますCompareToメソッドで定義された順序。
ComparableをJavaで実装するオブジェクトは、Comparatorを指定せずに、ソートされたマップのキーまたはTreeSetなどのソートされたセットの要素として使用できます。
サイト:ComparatorとComparableをJavaで使用する方法例付き
Comparable
は、自然な順序のオブジェクト用です。オブジェクト自体は、それがどのように順序付けられるかを知っています。Comparator
は、自然な順序付けのないオブジェクト、または異なる順序付けを使用する場合に使用します。
ComparatorとComparableインターフェイスの違い
Comparable
は、別のオブジェクトと一緒に使用して自分自身を比較するために使用されます。
Comparator
は、オブジェクトである2つのデータ型を比較するために使用されます。
これら2つの間の論理的な違いは、JavaのComparator
が提供された2つのオブジェクトを比較し、Comparable
インターフェイスが「this」参照を指定されたオブジェクトと比較することです。
JavaのComparable
は、オブジェクトの自然な順序付けを実装するために使用されます。 Java API文字列では、DateクラスとラッパークラスがComparable
インターフェイスを実装します。
クラスがJavaでComparable
インターフェースを実装している場合、そのオブジェクトのコレクションはList
またはArray
のいずれかをCollections.sort()
またはArray.sort()
メソッドを使用して自動的にソートでき、オブジェクトはcompareTo
メソッドで定義された自然順序に基づいてソートされます。
JavaでComparable
を実装するオブジェクトは、TreeSet
を指定せずに、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);
}
}
リンクをクリックして、さらに例を参照してください。 compamatic