Comparable是排序介面;若一個類實現了Comparable介面,就意味著“該類支援排序”。可以使用Arrays.sort()對改類進行排序
1.Comparable介面
使用場景:假如說我們有這樣一個需求,需要設計一個Person類,有兩個屬性:姓名(name)、年齡(age),按照年齡的大小進行排序,那麼實現可以這樣
注意:
public class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Person o) {
if (this.age > o.age) {
return 1;
} else {
return -1;
}
// return Integer.compare(this.age, o.age);
}
}
public static void main(String[] args) {
Person[] people = new Person[]{
new Person("張三",25),
new Person("李四",17),
new Person("王五",35),
};
Arrays.sort(people);
System.out.println(Arrays.toString(people));
}
Comparable
2.Comparator介面
Comparator也是一個比較器,但是屬於挽救設計的一種,一般來說盡量減少。
使用場景:假如說我們有這樣一個需求,需要對Person類的年齡進行排序,但是Person類是別人寫好的,裡面沒有Comparable介面,如果在不允許改變原始碼的情況下,我們可以使用Comparator介面。
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return Integer.compare(o1.getAge(), o1.getAge());
}
}
public static void main(String[] args) {
Person[] people = new Person[]{
new Person("張三",25),
new Person("李四",17),
new Person("王五",35),
};
Arrays.sort(people, new PersonComparator()); // 這裡需要加入比較器
System.out.println(Arrays.toString(people));
}
// 當然上述的類為了方便檢視,所以專門寫出來,可以看到PersonComparator類中只有一個方法,可以使用匿名類的方式來進行編寫
public static void main(String[] args) {
Person[] people = new Person[]{
new Person("張三",25),
new Person("李四",17),
new Person("王五",35),
};
Arrays.sort(people, (p1, p2)-> Integer.compare(p1.getAge(), p2.getAge())); // 這樣寫就不需要類比較器了
// Arrays.sort(people, Comparator.comparing(Person::getAge)); // 最簡寫法
System.out.println(Arrays.toString(people));
}
總結
Comparable和Comparator的區別:
java.lang.Comparable:在類定義的時候,可以實現好的介面,裡面有compareTo這個方法需要實現。
java.util.Comparator:是挽救的比較介面,需要單獨定義一個比較類,裡面有compare比較方法。
在設計階段,我們使用比較多的是Comparable介面。
但在實際開發過程中的話,我們通常使用匿名內部類的方式,所以更多使用的是Comparator,不過一般是在演算法題中使用,真正在專案中使用的情況確實不多。
參考:
https://blog.csdn.net/qq_41474648/article/details/105182845