ComparableとComparatorの両方を実装するクラスを見てきました。これは何を意味するのでしょうか?なぜ一方を他方で使用するのですか?
ComparableとComparatorの両方を実装するクラスを見てきました。これは何を意味するのでしょうか?なぜ一方を他方で使用するのですか?
回答:
以下のテキストは、比較対比較可能です
同程度の
比較可能なオブジェクトは、それ自体を別のオブジェクトと比較することができます。クラス自体は、java.lang.Comparableそのインスタンスを比較できるようにするために、インターフェースを実装する必要があります。
コンパレータ
コンパレータオブジェクトは、2つの異なるオブジェクトを比較できます。クラスはそのインスタンスを比較していませんが、他のいくつかのクラスのインスタンスを比較しています。このコンパレータクラスは、java.util.Comparatorインターフェイスを実装する必要があります。
実装とComparableは、「自分を別のオブジェクトと比較できること」を意味します。これは通常、単一の自然なデフォルト比較がある場合に役立ちます。
実装とComparatorは、「他の2つのオブジェクトを比較できること」を意味します。これは通常、型の2つのインスタンスを比較する方法が複数ある場合に便利です。たとえば、年齢、名前などで人を比較できます。
Personimplement を作成するだけでは実行できません。2人の比較方法Comparableを変更することはできないためです。
                    Person。2)コンパレータ。たとえば、PersonAgeComparator2つの異なるエンティティを比較し、特定のソート順で最初に来るエンティティを決定できます。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に一般的なケースを提供します。たとえば、Stringsがデフォルトの大文字と小文字を区別しソートでですが、静的もあります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つの間の論理的な違いはComparatorJavaで彼に提供された2つのオブジェクトを比較する一方で、Comparableインターフェースは「this」参照を指定されたオブジェクトと比較します。
ComparableJavaでは、オブジェクトの自然な順序付けを実装するために使用されます。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);         
    }  
} リンクをクリックすると、他の例が表示されます。相応の