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