目次
Comparable インターフェイスと Comparator の比較
同等のインターフェース
役割: 参照データ型の比較と並べ替えを実現する
用途: 比較対象のクラスはインターフェースを実装し、インターフェースの compareTo メソッド
インスタンスをオーバーライドします。
public class Person {
private String name;//姓名
private int age;//年龄
public Person(String name,int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "姓名:" + name + " 年龄:" + age;
}
}
前述の Person クラスのインスタンス化されたオブジェクトは 4 つになりました. Comparable インターフェイスを使用してこれらの 4 つのインスタンス化されたオブジェクトを年齢またはその他の属性に従って並べ替えるには、Person クラスで Comparable インターフェイスを実装し、compareTo メソッドをオーバーライドする必要があります。
public class Person implements Comparable<Person> {
....
@Override
public int compareTo(Person o) {
//return o.age - this.age; //降序排列
return this.age - o.age; //升序排列
}
}
テスト:
public class ComparableTestDrive {
public static void main(String[] args) {
Person[] person = new Person[4];
person[0] = new Person("huahua",18);
person[1] = new Person("niuniu",19);
person[2] = new Person("manage",28);
person[3] = new Person("shuaishuai",17);
Arrays.sort(person);
System.out.println(Arrays.toString(person));
}
}
//输出:(年龄升序)
//[姓名:shuaishuai 年龄:17, 姓名:huahua 年龄:18, 姓名:niuniu 年龄:19, 姓名:manage 年龄:28]
コンパレータインターフェース(コンパレータ)
Comparator は参照データ型のソートにも使用できます. Comparable インターフェイスと比較して独自の利点があります. Comparator と Compareable インターフェイスの比較は 3 番目の部分で記述します.
前述の Person クラスについては、Comparator インターフェイスを使用して年齢やその他の属性でソートする場合、Person クラスを操作する必要はなくなり、匿名の内部クラスを使用して、使用時に比較メソッドを実装するだけで済みます。この比較メソッドによって実現されるソートは、比較対象の型に依存しなくなり、比較とオブジェクト型の分離を実現するため、非カスタム クラスが使用されている場合でも、目的のデータのソートが可能になります。このインターフェイスを介して達成されます。
テスト (Person クラスを操作せずに):
public class ComparableTestDrive {
public static void main(String[] args) {
Person[] person = new Person[4];
person[0] = new Person("huahua",18);
person[1] = new Person("niuniu",19);
person[2] = new Person("manage",28);
person[3] = new Person("shuaishuai",17);
Arrays.sort(person, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
//return o2.getAge() - o1.getAge();//降序排列
return o1.getAge() - o2.getAge();//升序排列
}
});
System.out.println(Arrays.toString(person));
}
}
//输出(按年龄升序的结果):
//[姓名:shuaishuai 年龄:17, 姓名:huahua 年龄:18, 姓名:niuniu 年龄:19, 姓名:manage 年龄:28]
Comparable インターフェイスと Comparator の比較
文字通りの意味の違い:
- Comparable はableで終わり、これもfunctionを表します. 例えば、前述の Person クラスは、 Comparable インターフェースを実装した後、 Person クラスのオブジェクト間の比較機能を持つと理解できます。
- Comparator はコンパレーターを意味し、比較のためのツールまたは比較の参加者のようなものです。
使い方の違い:
- Comparableインターフェースを使用してオブジェクトを比較またはソートするには、オブジェクトの対応するクラスに Comparable インターフェースを実装し、compareToメソッドをオーバーライドする必要があります。
- Comparatorインターフェイスを使用してオブジェクトを並べ替えます。匿名の内部クラスを使用して、並べ替えクラスの外部に Comparator インターフェイスを実装し、 compareメソッドをオーバーライドできます。
アプリケーション シナリオの違い:
- Comparable インターフェイスを使用して並べ替えを実装し、並べ替えクラスの内部で操作する必要があります
- Comparator コンパレータ インターフェイスを使用すると、比較オブジェクトとコンパレータの分離を実現し、クラス外の無名内部クラスを介してオブジェクト間でオブジェクトを比較できます。
要約する
Comparable インターフェースと Comparator インターフェースの両方を使用して、カスタム オブジェクト間の比較と並べ替えを行うことができます. 違いは、Comparableインターフェースを使用する場合、比較クラスを操作する必要があり、 compareTo メソッドをオーバーライドする必要があることです. このように、サードパーティが提供するクラスは操作が難しく、Comparatorインターフェースを使用すると、匿名の内部クラスの比較メソッドをオーバーライドして、比較クラスを操作せずに比較オブジェクトの並べ替えを実現できます。つまり、 Comparable は「内部」の並べ替えのためのインターフェースに似ていますが、Compator コンパレーターは比較クラスからの分離を実現し、比較クラスを変更せずに並べ替えを実現するため、 「外部」の並べ替えを提供するインターフェースに似ています。