Java compare()とcompareTo()メソッドの違いは何ですか?それらの方法は同じ答えを出しますか?
Java compare()とcompareTo()メソッドの違いは何ですか?それらの方法は同じ答えを出しますか?
回答:
JavaNotesから:
a.compareTo(b):
比較可能なインターフェース:値を比較し、値がより小さいか、等しいか、より大きいかを示す整数を返します。
クラスオブジェクトに自然な順序がある場合は、Comparable<T>インターフェースを実装し、このメソッドを定義します。自然順序付けの実装を持つすべてのJavaクラスComparable<T>-例:String、ラッパークラス、BigInteger
compare(a, b):
コンパレータインターフェイス: 2つのオブジェクトの値を比較します。これは、の一部として実装されるComparator<T>インタフェース、及び典型的な使用は、次のようなメソッドに渡すこれを実現する一つまたはそれ以上の小さなユーティリティクラスを定義することであるsort()か、などのデータ構造をソートすることによって使用するためにTreeMap及びTreeSet。以下のComparatorオブジェクトを作成できます。
sort()。メソッドに渡すこれらのそれぞれに対してコンパレータを定義します。クラスオブジェクトに1つの自然なソート順がある場合、compare()は必要ない場合があります。
http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.htmlからの要約
比較可能比較
可能オブジェクトは、それ自体を別のオブジェクトと比較できます。
コンパレータ
コンパレータオブジェクトは、2つの異なるオブジェクトを比較できます。クラスはインスタンスを比較していませんが、他のクラスのインスタンスを比較しています。
ユースケースのコンテキスト:
同等のインターフェース
equalsメソッドと==and != 演算子は、等価/ 不等価をテストしますが、相対値をテストする方法は提供しません。
一部のクラス(たとえば、文字列や自然順序付けを持つ他のクラス)Comparable<T>は、compareTo()メソッドを定義するインターフェースを実装しています。またはメソッドで使用する場合は、クラス
に実装Comparable<T>するCollections.sort()必要がありArrays.sort()ます。
Comparatorオブジェクトの定義
コンパレータを作成して、任意のクラスの任意の方法で並べ替えることができます。
たとえば、StringクラスはCASE_INSENSITIVE_ORDERコンパレーターを定義します。
:二つのアプローチの違いは、の概念にリンクすることができ
順序付きコレクション:
コレクションが順序付けられると、特定の(ランダムでHashtableはない)順序でコレクションを反復処理できることを意味します(a は順序付けされません)。
自然な順序のコレクションは、順序付けされるだけでなく、並べ替えられます。自然な順序の定義は難しい場合があります!(自然な文字列順のように)。
コメントでHaveAGuessが指摘した別の違い:
Comparable は実装内にあり、インターフェースからは見えないため、並べ替えを行うと、何が起こるか本当にわかりません。 Comparator 順序が適切に定義されることを保証します。 compareTo()Comparableインターフェースからです。
compare()Comparatorインターフェースからです。
どちらの方法も同じことを行いますが、各インターフェースは少し異なるコンテキストで使用されます。
同等のインターフェースを実装するクラスのオブジェクトの自然順序付けを課すために使用されます。このcompareTo()方法は自然比較法と呼ばれます。コンパレータインターフェースを実装するクラスのオブジェクトに全体順序付けを課すために使用されます。詳細については、各インターフェイスをいつ使用するかについてのリンクを参照してください。
類似点:
どちらも2つのオブジェクトを比較するカスタム方法です。
どちらもint、2つのオブジェクト間の関係を説明する記述を返します。
相違点:
メソッドcompare()は、Comparatorインターフェースを実装する場合に実装する義務があるメソッドです。2つのオブジェクトをメソッドに渡すことができ、intそれらの関係を説明するものを返します。
Comparator comp = new MyComparator();
int result = comp.compare(object1, object2);
メソッドcompareTo()は、Comparableインターフェースを実装する場合に実装する義務があるメソッドです。これにより、オブジェクトを類似したタイプのオブジェクトと比較できます。
String s = "hi";
int result = s.compareTo("bye");
概要:
基本的に、これらは物事を比較する2つの異なる方法です。
compareTo(T object)
このオブジェクトを別のオブジェクトと比較して、このオブジェクトの負のint値がより小さい、0が等しい、または正の値が他方より大きいことを示すために実装されたjava.lang.Comparableインターフェースから来ます。これはより便利な比較メソッドですが、比較するすべてのクラスに実装する必要があります。
compare(T obj1, T obj2)
別のクラスのオブジェクトを比較する別のクラスに実装されているjava.util.Comparatorインターフェースから来て、最初のオブジェクトの負のint値がより小さい、0が等しい、または正の値が2番目のオブジェクトより大きい。クラスは変更できないため、compareTo()を実装できない場合に必要です。また、オブジェクトを比較する方法を1つだけではなく(名前や年齢などで)比較する場合にも使用されます。
コンパレータを使用すると、クラスに対してn個の比較ロジックを作成できます。
例えば
車のクラスの場合
車の型番に基づいて比較するComparatorクラスを持つことができます。車の年式に基づいて比較するためのコンパレータクラスを使用することもできます。
車のクラス
public class Car {
int modelNo;
int modelYear;
public int getModelNo() {
return modelNo;
}
public void setModelNo(int modelNo) {
this.modelNo = modelNo;
}
public int getModelYear() {
return modelYear;
}
public void setModelYear(int modelYear) {
this.modelYear = modelYear;
}
}
モデル番号に基づくコンパレータ#1
public class CarModelNoCompartor implements Comparator<Car>{
public int compare(Car o1, Car o2) {
return o1.getModelNo() - o2.getModelNo();
}
}
モデルイヤーに基づくコンパレータ#2
public class CarModelYearComparator implements Comparator<Car> {
public int compare(Car o1, Car o2) {
return o1.getModelYear() - o2.getModelYear();
}
}
しかし、これはComparableインターフェースの場合には不可能です。
Comparableインターフェースの場合、compareTo()メソッドで使用できるロジックは1つだけです。
このメソッドを持つオブジェクトとその共同編集者の関係は異なります。
compareTo()はインタフェースComparableのメソッドなので、このインスタンスを別のインスタンスと比較するために使用されます。
compare()はインターフェースComparatorのメソッドであるため、別のクラスの2つの異なるインスタンスを互いに比較するために使用されます。
もしそうなら、実装Comparableとはクラスのインスタンスを簡単に比較できることを意味します。
実装Comparatorとは、インスタンスが(他のクラスの)異なるオブジェクトを比較するのに適していることを意味します。
主な違いは、インターフェースの使用です。
Comparable(compareTo()を使用)では、オブジェクトを比較して(TreeMapを使用するため、またはリストをソートするために)、そのインターフェースを実装する必要があります。しかし、クラスがComparableを実装せず、サードパーティライブラリの一部であるため変更できない場合はどうなりますか?次に、コンパレータを実装する必要があります。これは、使用するのに少し不便です。
compareTo()あるオブジェクトで呼び出され、別のオブジェクトと比較されます。
compare()他の2つのオブジェクトを比較するために、いくつかのオブジェクトで呼び出されます。
違いは、実際の比較を行うロジックが定義されているところです。
オブジェクトFooを含むリストをソートする場合、リストのソートメソッドがこのメソッドを使用しているため、FooクラスはComparableインターフェースを実装する必要があります。
他の2つのクラスを比較するUtilクラスを作成する場合は、Comparatorクラスを実装できます。
従業員テーブル
名、DoB、給与
トーマス、1982年2月10日、
ダニエル300、1990年3 月11日、
クワメ400 、1998年2月10日、520
匹敵例えば、あなたが名前または給料で並べ替えることができ-インタフェースを使用すると、1つのプライマリフィールドを参照して、オブジェクト例えば従業員のリストをソートすることを可能にするのCompareTo()メソッド
emp1.getName().compareTo(emp2.getName())
そのような要件のためのより柔軟なインターフェースがComparatorインターフェースによって提供され、その唯一のメソッドはcompare()です。
public interface Comparator<Employee> {
int compare(Employee obj1, Employee obj2);
}
サンプルコード
public class NameComparator implements Comparator<Employee> {
public int compare(Employee e1, Employee e2) {
// some conditions here
return e1.getName().compareTo(e2.getName()); // returns 1 since (T)omas > (D)an
return e1.getSalary().compareTo(e2.getSalary()); // returns -1 since 400 > 300
}
}
強調すべき技術的な側面もあります。クライアントクラスからの比較動作のパラメーター化が必要であり、次のようなメソッドを使用するのComparableかComparator、それとも使用するのか疑問に思っているとします。
class Pokemon {
int healthPoints;
int attackDamage;
public void battle (Comparable<Pokemon> comparable, Pokemon opponent) {
if (comparable.compareTo(opponent) > 0) { //comparable needs to, but cannot, access this.healthPoints for example
System.out.println("battle won");
} else {
System.out.println("battle lost");
}
}
}
comparableラムダまたはオブジェクトでありcomparable、thisポケモンのフィールドにアクセスする方法はありません。(ラムダでthisは、プログラムテキストで定義されているように、ラムダのスコープ内の外部クラスインスタンスを指します。)したがって、これは飛行せずComparator、2つの引数を持つを使用する必要があります。
Important Answar
String name;
int roll;
public int compare(Object obj1,Object obj2) { // For Comparator interface
return obj1.compareTo(obj1);
}
public int compareTo(Object obj1) { // For Comparable Interface
return obj1.compareTo(obj);
}
ここでreturn obj1.compareTo(obj1)or return obj1.compareTo(obj)ステートメントはObjectのみを受け取ります。プリミティブは許可されていません。例えば
name.compareTo(obj1.getName()) // Correct Statement.
だが
roll.compareTo(obj1.getRoll())
// Wrong Statement Compile Time Error Because roll
// is not an Object Type, it is primitive type.
名前は文字列オブジェクトなので、機能しました。学生のロール番号をソートする場合は、以下のコードを使用してください。
public int compareTo(Object obj1) { // For Comparable Interface
Student s = (Student) obj1;
return rollno - s.getRollno();
}
または
public int compare(Object obj1,Object obj2) { // For Comparator interface
Student s1 = (Student) obj1;
Student s2 = (Student) obj2;
return s1.getRollno() - s2.getRollno();
}