142

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

4

11 に答える 11

242

以下のテキストは、コンパレータと比較可能からのものです

同程度の

同等のオブジェクトは、それ自体を別のオブジェクトと比較することができます。クラス自体は、java.lang.Comparableそのインスタンスを比較できるようにするためにインターフェースを実装する必要があります。

コンパレータ

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

于 2009-09-17T17:14:08.540 に答える
157

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

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

于 2009-09-17T17:14:50.373 に答える
38

Comparableを使用すると、クラスは独自の比較を実装できます。

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

比較すると、コンパレータは外部比較です。

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

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

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

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

おかしなことに、それ自体をサブクラスにサブクラス化する場合、サブクラスも比較可能であり、それに対して堅牢である必要があります(または、リスコフの原則を破り、実行時エラーが発生します)。

于 2009-09-17T17:23:58.590 に答える
21

java.lang.Comparable

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

    int a.compareTo(b)

  2. インスタンスをソートするクラスを変更する必要があります。クラスごとに1つのソートシーケンスのみを作成できるようにします。

java.util.Comparator

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

    int compare (a,b)

  2. インスタンスをソートするクラスとは別のクラスを作成します。クラスごとに複数のソートシーケンスを作成できるようにします。
于 2012-05-17T19:12:47.117 に答える
14

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

AComparatorは、特定の用途の注文自体を表します。

于 2009-09-17T17:14:29.053 に答える
8

Comparable通常は優先されます。ただし、クラスがすでに実装している場合もありComparableますが、別のプロパティで並べ替えたい場合があります。次に、を使用する必要がありますComparator

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

于 2009-09-17T17:15:09.640 に答える
6

Webで見つけたComparatorとComparableの違いは次のとおりです。

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

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

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

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

サイト:JavaでComparatorとComparableを使用する方法は?例を挙げて

続きを読む:JavaでComparatorとComparableを使用する方法は?例を挙げて

于 2011-09-05T01:59:45.677 に答える
5

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

于 2009-09-17T17:15:44.887 に答える
4

コンパレータと同等のインターフェースの違い

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

Comparator2つのデータ型がオブジェクトであることを比較するために使用されます。

于 2010-10-25T16:24:08.460 に答える
2

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

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

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

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

于 2012-02-14T04:30:32.477 に答える
0

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);         
    }  
} 

その他の例を表示するには、リンクをクリックしてください。コンパマティック

于 2012-01-08T01:34:06.630 に答える