JAvaリストオブジェクト並べ替えComparableとComparatorの違い
2880 ワード
JAvaでオブジェクトをソートする必要がある場合、このオブジェクトはComparableを実装する必要があります.Comparableインタフェースはソートインタフェースであり、オブジェクトがこのインタフェースを実装するとソートをサポートします.これはjdkにおけるString実装を参照することができる.コードを見てみましょう.
personクラスは、Comparableインタフェースを実現し、年齢別にソートし、年齢が同じ場合は名前別にソートし、StringクラスはComparableインタフェースを実現し、comparareToメソッドを直接呼び出せばよい
よびだし
結果:
name:A7;age:5 name:A4;age:6 name:A5;age:6 name:A2;age:8 name:A3;age:9 name:A1;age:10 name:A6;age:12
personクラスがComparableインタフェースを実装していない場合は、外部呼び出しソート時にComparatorインタフェースを使用する必要があります.
結果:
name:A7;age:5 name:A4;age:6 name:A5;age:6 name:A2;age:8 name:A3;age:9 name:A1;age:10 name:A6;age:12
インタフェースComparableの実装と外部でのComparatorインタフェースの使用の結果は同じであることがわかります.
まとめ:
相違点:
Comparableは内部比較インタフェースであり、通常、オブジェクトが内部ソートを必要とする場合に直接実装されます.
Comparatorは外部比較インタフェースであり、通常、オブジェクトにソートインタフェースが実装されず、ソートが必要な場合に実装される.
同じ点:
2つの機能は似ていますが、1つは内部で、1つは外部です.
personクラスは、Comparableインタフェースを実現し、年齢別にソートし、年齢が同じ場合は名前別にソートし、StringクラスはComparableインタフェースを実現し、comparareToメソッドを直接呼び出せばよい
public class Person implements Comparable{
private String name;
private int age;
//
//set、get ...
public int compareTo(Person p) {
// TODO Auto-generated method stub
if (this.age == p.age) {
return this.name.compareTo(p.name);
} else {
return this.age - p.age;
}
}
}
よびだし
public static void main(String[] args) {
List list = new ArrayList();
Person p1 = new Person("A1", 10);
Person p2 = new Person("A2", 8);
Person p3 = new Person("A3", 9);
Person p4 = new Person("A5", 6);
Person p5 = new Person("A4", 6);
Person p6 = new Person("A6", 12);
Person p7 = new Person("A7", 5);
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
list.add(p6);
list.add(p7);
Collections.sort(list);
for (Person p : list) {
String s = p.toString();
System.out.println(s);
}
}
結果:
name:A7;age:5 name:A4;age:6 name:A5;age:6 name:A2;age:8 name:A3;age:9 name:A1;age:10 name:A6;age:12
personクラスがComparableインタフェースを実装していない場合は、外部呼び出しソート時にComparatorインタフェースを使用する必要があります.
public static void main(String[] args) {
List list = new ArrayList();
Person p1 = new Person("A1", 10);
Person p2 = new Person("A2", 8);
Person p3 = new Person("A3", 9);
Person p4 = new Person("A5", 6);
Person p5 = new Person("A4", 6);
Person p6 = new Person("A6", 12);
Person p7 = new Person("A7", 5);
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
list.add(p6);
list.add(p7);
//Collections.sort(list);
Collections.sort(list, new Comparator() {
public int compare(Person p1, Person p2) {
// TODO Auto-generated method stub
if (p1.getAge() == p2.getAge()) {
return p1.getName().compareTo(p2.getName());
} else {
return p1.getAge() - p2.getAge();
}
}
});
for (Person p : list) {
String s = p.toString();
System.out.println(s);
}
}
結果:
name:A7;age:5 name:A4;age:6 name:A5;age:6 name:A2;age:8 name:A3;age:9 name:A1;age:10 name:A6;age:12
インタフェースComparableの実装と外部でのComparatorインタフェースの使用の結果は同じであることがわかります.
まとめ:
相違点:
Comparableは内部比較インタフェースであり、通常、オブジェクトが内部ソートを必要とする場合に直接実装されます.
Comparatorは外部比較インタフェースであり、通常、オブジェクトにソートインタフェースが実装されず、ソートが必要な場合に実装される.
同じ点:
2つの機能は似ていますが、1つは内部で、1つは外部です.