両方を実装するクラスを見ました同程度のそしてコンパレータ。これは何を意味するのでしょうか?なぜ私は一方をもう一方に使うのでしょうか?
以下のテキストは比較対比較可能
同程度の
匹敵するオブジェクトは他のオブジェクトとそれ自身を比較することができます。クラス自体がjava.lang.Comparable
そのインスタンスを比較できるようにするためのインターフェース。
コンパレータ
比較オブジェクトは、2つの異なるオブジェクトを比較できます。クラスはそのインスタンスを比較していませんが、他のクラスのインスタンスを比較しています。このコンパレータクラスは、java.util.Comparator
インタフェース。
実装するComparable
「自分と他のオブジェクトとを比較できる」という意味です。これは通常、単一の自然のデフォルト比較があるときに便利です。
実装するComparator
「他の2つのオブジェクトを比較できる」という意味です。これは通常、型の2つのインスタンスを比較する方法が複数ある場合に便利です。年齢、名前などで人々を比較できます。
Person
実装するComparable
変更できません。どうやって二人が比較されます。 - Jon SkeetPerson
。 2)比較器。PersonAgeComparator
これは、2つの異なるエンティティを比較して、その特定のソート順でどちらを先にするかを決定することができます。 3)ソートコード。エンティティのコレクションとコンパレータを受け取り、コンパレータを使用してそのコレクションをソートして順序を決定します。 - Jon Skeet
Comparableはクラスに独自の比較を実装させます。
比較すると、Comparatorは外部比較です。
両方の実装で、あなたはまだできます比較したいものを選択してください。 総称を使うと、宣言してコンパイル時にチェックすることができます。これにより安全性は向上しますが、適切な値を決定することも難題です。
ガイドラインとして、私は一般にそのオブジェクトが比較されることができる最も一般的なクラスまたはインタフェースを使用します、私が想像するすべてのユースケースで...しかし、あまり正確ではない定義! :-(
Comparable<Object>
コンパイル時にすべてのコードでそれを使用することを可能にします(必要ならば良いです、そうでなければ悪いです、そしてあなたはコンパイル時エラーを失います)。実装はオブジェクトに対処し、必要に応じて、ただし堅牢な方法でキャストする必要があります。Comparable<Itself>
それどころか非常に厳しいです。面白いことに、自分自身をサブクラスにサブクラス化するとき、サブクラスも比較可能でそれについて頑強でなければなりません(またはそれはLiskov Principleを破り、ランタイムエラーを起こすでしょう)。
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
ソート時にはデフォルトで大文字と小文字が区別されますが、静的変数もあります。Comparator
呼ばれるCASE_INSENSITIVE_ORDER
。
ここに私がウェブ上で見つけたComparatorとComparableの間のいくつかの違いがあります:
あなたがそれを見れば、これら2つの間の論理的な違いは、JavaにおけるComparatorが彼に与えられた2つのオブジェクトを比較するのに対し、Comparableインターフェースは "this"参照を指定されたオブジェクトと比較する。
Javaで比較可能なオブジェクトの自然な順序を実装するために使用されます。 Java API Stringでは、DateクラスとwrapperクラスがComparableインタフェースを実装しています。
いずれかのクラスがJavaでComparableインターフェイスを実装する場合、そのオブジェクトのコレクションListまたはArrayは、Collections.sort()またはArray.sort()メソッドを使用して自動的にソートでき、オブジェクトはCompareToメソッドで定義された自然順序に基づいてソートされます。
JavaでComparableを実装するオブジェクトは、ソートマップのキーまたはソートセットの要素(TreeSetなど)として使用できます。ただし、Comparatorを指定する必要はありません。
site:JavaでComparatorとComparableを使用する方法例では
Comparable
自然な順序のオブジェクト用です。オブジェクト自体は、それがどのように順序付けされるべきかを知っています。
Comparator
自然な順序付けのないオブジェクト、または別の順序付けを使用したいオブジェクト用です。
ComparatorインタフェースとComparableインタフェースの違い
Comparable
他のオブジェクトと使用して自分自身を比較するために使用されます。
Comparator
2つのデータ型がオブジェクトであることを比較するために使用されます。
あなたが見るならば、これら二つの間の論理的な違いはComparator
Javaでは、彼に提供された2つのオブジェクトを比較します。Comparable
インタフェースは "this"参照を指定されたオブジェクトと比較します。
Comparable
Javaでは、オブジェクトの自然順序付けを実装するために使用されます。 Java API Stringでは、Dateクラスとwrapperクラスが実装しています。Comparable
インタフェース。
いずれかのクラスが実装している場合Comparable
JavaのインタフェースそれからそのオブジェクトのコレクションList
またはArray
を使用して自動的にソートすることができますCollections.sort()
またはArray.sort()
メソッドとオブジェクトは、で定義された自然順序に基づいてソートされます。compareTo
方法。
実装するオブジェクトComparable
Javaでは、ソートマップのキーまたはソートセットの要素として使用できます。TreeSet
何も指定せずにComparator
。
ComparableとComparatorを実装するための私のアノテーションlib:
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);
}
}
他の例を見るにはリンクをクリックしてください。気軽な