Java中Comparable和Comparator比較
阿新 • • 發佈:2017-10-02
collect clas bold 數據 let 排序類 height webkit tom
Comparable 是一個排序接口,如果一個類實現了該接口,說明該類本身是可以進行排序的。註意,除了基本數據類型(八大基本數據類型) 的數組或是List,其余類型的對象,Collections.sort或Arrays.sort 是不支持直接進行排序的,因為對象本身是沒有“順序”的,除非你實現了Comparable 接口或是自定義了Comparable 對象,指定了排序規則,才可以進行排序。
Comparable 源碼就一個方法,
1 public interface Comparable<T> { 2 publicint compareTo(T o); 3 }
定義一個對象:
1 public class Person implements Comparable<Person>{ 2 public int age; 3 4 public Person(int age){ 5 this.age = age; 6 } 7 public String toString() {8 return "{" + 9 "age=" + age + 10 ‘}‘; 11 } 12 @Override 13 public int compareTo(Person o) { 14 //Person 對象之間根據名字排序 15 return this.age - o.age; 16 } 17 }
排序測試:
public static void main(String[] args) { Person[] ps =new Person[]{new Person(1),newPerson(4), new Person(2),new Person(7),new Person(9),new Person(8), new Person(3),new Person(0),new Person(1)}; System.out.println("排序前:"+Arrays.toString(ps)); //進行排序 Arrays.sort(ps); System.out.println("排序後:"+Arrays.toString(ps)); }
排序前:[{age=1}, {age=4}, {age=2}, {age=7}, {age=9}, {age=8}, {age=3}, {age=0}, {age=1}]
排序後:[{age=0}, {age=1}, {age=1}, {age=2}, {age=3}, {age=4}, {age=7}, {age=8}, {age=9}]
如果一個類本身並沒有實現 Comparable 接口,我們想要對他進行排序,就要自定義 Comparator 比較器進行比較,在這個比較器裏面自定義排序的依據。
Comparator 源碼中主要的兩個接口方法:
1 public interface Comparator<T> 2 { 3 int compare(T o1, T o2); 4 boolean equals(Object obj); 5 }
定義一個用來排序類,該類並為實現 Comparable 接口:
1 private static class Man{ 2 public int age; 3 public Man(int age){ 4 this.age = age; 5 } 6 public String toString() { 7 return "{" + 8 "age=" + age + 9 ‘}‘; 10 } 11 }
進行排序:
1 @Test 2 public void test_1(){ 3 Man[] ps =new Man[]{new Man(1),new Man(4),new Man(2), 4 new Man(7),new Man(9),new Man(8),new Man(3),new Man(0),new Man(1)}; 5 //數組轉List 6 ArrayList<Man> ap = new ArrayList<Man>(Arrays.asList(ps)); 7 8 System.out.println("排序前:"+ap); 9 //自定義排序器 10 Collections.sort(ap,new Comparator<Man>() { 11 @Override 12 public int compare(Man o1, Man o2) { 13 //根據年齡進行排序 14 return o1.age - o2.age; 15 } 16 }); 17 18 System.out.println("排序後:"+ ap); 19 }
排序前:[{age=1}, {age=4}, {age=2}, {age=7}, {age=9}, {age=8}, {age=3}, {age=0}, {age=1}]
排序後:[{age=0}, {age=1}, {age=1}, {age=2}, {age=3}, {age=4}, {age=7}, {age=8}, {age=9}]
Comparable 在類的內部定義排序規則,Comparator 在外部定義排序規則,Comparable 相當於“內部排序器”,Comparator 相當於“外部排序器”,前者一次定義即可,後者可以在不修改源碼的情況下進行排序,各有所長。
Java中Comparable和Comparator比較