-
1. Comparable
-
2. Compator
-
3. Comparable 和 Compator 的區別
1.Comparable 是一個接口,代碼如下, 其中T就是要比較的對象。
public interface Comparable<T> {
public int compareTo(T o);
}
對於一個類Person 有兩個屬性 年齡和姓名,需求是我們根據其中的年齡進行排序。
public class Person {
private int age;
private String name;
public int getAge() {
return age;
}
public String getName() {
return name;
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
}
要比較,我們需要對用Person類實現Comparable接口,我們再代碼裏用到了Arrays.sort()來對數組進行排序,數組中的每個元素是實現了Comparable接口的對象,具體代碼如下:
import java.util.Arrays;
public class Person implements Comparable<Person> {
private int age;
private String name;
public int getAge() {
return age;
}
public String getName() {
return name;
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public int compareTo(@NotNull Person o) {
return this.age - o.getAge();
}
public static void main(String[] args) {
Person[] personArray = new Person[]{new Person(10, "Liam"), new Person(7, "Bob")};
System.out.println("原來的順序");
for (Person person : personArray) {
System.out.print(person.getName() + "----" + person.getAge() + " ");
}
System.out.println();
System.out.println("後來的順序");
Arrays.sort(personArray);
for (Person person : personArray) {
System.out.print(person.getName() + "----" + person.getAge() + " ");
}
}
}
運行結果如圖 :
我們可以看到要對對象進行排序,需要更改該對象對應的類的源碼。
2.Compator
Comapator接口,該接口有個compare 方法, 我們寫的實現類只需重寫該方法就可以了
public interface Comparator<T> {
int compare(T o1, T o2);
其餘的一些方法...
}
但是Compator 接口也有更多的 其他方法,感興趣的可以去看看
Person 類
public class Person {
private int age;
private String name;
public int getAge() {
return age;
}
public String getName() {
return name;
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
}
我們只需寫一個比較器類,該類實現了Compator<T> 接口即可。
import java.util.Arrays;
import java.util.Comparator;
public class ComparatorPerson implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
public static void main(String[] args) {
Person[] personArray = new Person[]{new Person(10, "Liam"), new Person(7, "Bob")};
System.out.println("原來的順序");
for (Person person : personArray) {
System.out.print(person.getName() + "----" + person.getAge() + " ");
}
System.out.println();
System.out.println("後來的順序");
Arrays.sort(personArray, new ComparatorPerson());
for (Person person : personArray) {
System.out.print(person.getName() + "----" + person.getAge() + " ");
}
}
}
得出的結果是和使用Comparable結果是一致的,只是這個地方不用再源碼Person上修改代碼,而是新建一個比較器類
3.Comparable和Compator兩個的區別
Comparable 的使用,我們需要在源碼Person上重寫compareTo方法,而在Compator的使用中我們無需在源碼Person上重寫相關的方法,而是只需要新建一個比較器類即可,該比較器實現了Compator接口的compare方法。所以Comparable可以稱之爲內部比較器,而Compator可以稱之爲外部比較器。