web-dev-qa-db-ja.com

クラスを比較可能および/またはコンパレーターにする必要があるのはいつですか?

ComparableComparatorの両方を実装するクラスを見てきました。これは何を意味するのでしょうか?なぜ私は一方をもう一方の上に使用するのですか?

131
Nick Heiner

以下のテキストは Comparator vs Comparable

比較可能

比較可能なオブジェクトは、それ自体を別のオブジェクトと比較できます。インスタンスを比較するには、クラス自体がJava.lang.Comparableインターフェイスを実装する必要があります。

コンパレータ

コンパレータオブジェクトは、2つの異なるオブジェクトを比較できます。クラスはインスタンスを比較していませんが、他のクラスのインスタンスを比較しています。このコンパレータクラスは、Java.util.Comparatorインターフェイスを実装する必要があります。

224
Dan

Comparableの実装は、「自分を別のオブジェクトと比較できます。」を意味します。これは、単一の自然なデフォルト比較がある場合に通常役立ちます。

Comparatorの実装は、「他の2つのオブジェクトを比較できます。」を意味します。これは通常、2つのタイプのインスタンスを比較する方法が複数ある場合に役立ちます。年齢、名前などで人を比較できます.

138
Jon Skeet

Comparableにより、クラスは独自の比較を実装できます。

  • 同じクラスにあります(多くの場合、利点です)
  • 1つの実装のみ(したがって、2つの異なるケースが必要な場合は使用できません)

比較すると、Comparatorは外部比較です。

  • 通常、一意のインスタンス(同じクラスまたは別の場所)にあります
  • あなた各実装に名前を付けるあなたが物事をソートしたい方法で
  • 制御しないクラスのコンパレータを提供できます
  • 実装は最初のオブジェクトがnullでも使用可能

どちらの実装でも、まだ比較するものを選択できます。ジェネリックを使用すると、宣言して、コンパイル時にチェックすることができます。これにより安全性が向上しますが、適切な値を決定することも課題です。

ガイドラインとして、私は一般に、そのオブジェクトを比較できる最も一般的なクラスまたはインターフェースを使用しますが、私が想定するすべてのユースケースで...定義はあまり正確ではありません! :-(

  • Comparable<Object>を使用すると、コンパイル時にすべてのコードで使用できます(必要な場合は適切ですが、必要でない場合は無効であり、コンパイル時エラーが発生しません)。実装はオブジェクトに対処し、必要に応じて堅牢な方法でキャストする必要があります。
  • それどころか、Comparable<Itself>は非常に厳密です。

面白いことに、サブクラスをサブクラスにサブクラス化するとき、サブクラスも比較可能であり、堅牢である必要があります(または、リスコフの原理を破り、実行時エラーが発生します)。

36
KLE

Java.lang.Comparable

  1. Comparableインターフェイスを実装するには、クラスは単一のメソッドcompareTo()を実装する必要があります

    int a.compareTo(b)

  2. インスタンスをソートするクラスを変更する必要があります。したがって、クラスごとに作成できるソートシーケンスは1つだけです。

Java.util.Comparator

  1. Comparatorインターフェースを実装するには、クラスは単一のメソッドcompare()を実装する必要があります

    int compare (a,b)

  2. インスタンスをソートするクラスとは別のクラスを構築します。そのため、クラスごとに複数のソートシーケンスを作成できます。
19
codiacTushki

Comparableは、データオブジェクトに自然な順序がある場合など、データオブジェクトのデフォルトの順序を提供するためのものです。

Comparatorは、特定の用途の順序自体を表します。

14
starblue

通常、Comparableが推奨されます。ただし、クラスがすでにComparableを実装している場合がありますが、別のプロパティでソートしたい場合があります。次に、Comparatorを使用する必要があります。

一部のクラスは、実際に一般的な場合にComparatorsを提供します。たとえば、 String sはデフォルトでソート時に大文字と小文字を区別しますが、 CASE_INSENSITIVE_ORDER と呼ばれる静的なComparatorもあります。

8
Michael Myers

以下は、Webで見つけたComparatorとComparableの違いです。

  1. これら2つの間の論理的な違いは、JavaのComparatorが提供された2つのオブジェクトを比較し、Comparableインターフェイスが「this」参照を指定されたオブジェクトと比較することです。

  2. JavaのComparableは、オブジェクトの自然な順序付けを実装するために使用されます。 Java AP​​I文字列では、DateクラスとラッパークラスがComparableインターフェイスを実装します。

  3. クラスがJavaのComparableインターフェースを実装している場合、そのオブジェクトのコレクションは、Collections.sort()またはArray.sort()メソッドを使用して自動的にソートでき、オブジェクトはそこに基づいてソートされますCompareToメソッドで定義された順序。

  4. ComparableをJavaで実装するオブジェクトは、Comparatorを指定せずに、ソートされたマップのキーまたはTreeSetなどのソートされたセットの要素として使用できます。

サイト:ComparatorとComparableをJavaで使用する方法例付き

続きを読む: JavaでComparatorとComparableを使用する方法?例付き

6
javapassion

Comparableは、自然な順序のオブジェクト用です。オブジェクト自体は、それがどのように順序付けられるかを知っています。
Comparatorは、自然な順序付けのないオブジェクト、または異なる順序付けを使用する場合に使用します。

ComparatorとComparableインターフェイスの違い

Comparableは、別のオブジェクトと一緒に使用して自分自身を比較するために使用されます。

Comparatorは、オブジェクトである2つのデータ型を比較す​​るために使用されます。

これら2つの間の論理的な違いは、JavaのComparatorが提供された2つのオブジェクトを比較し、Comparableインターフェイスが「this」参照を指定されたオブジェクトと比較することです。

JavaのComparableは、オブジェクトの自然な順序付けを実装するために使用されます。 Java AP​​I文字列では、DateクラスとラッパークラスがComparableインターフェイスを実装します。

クラスがJavaでComparableインターフェースを実装している場合、そのオブジェクトのコレクションはListまたはArrayのいずれかをCollections.sort()またはArray.sort()メソッドを使用して自動的にソートでき、オブジェクトはcompareToメソッドで定義された自然順序に基づいてソートされます。

JavaでComparableを実装するオブジェクトは、TreeSetを指定せずに、Comparatorなどのソート済みマップのキーまたはソート済みセットの要素として使用できます。

2
Srinivas

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

0
Jianmin Liu