1. 程式人生 > >Java中Comparable和Comparator比較

Java中Comparable和Comparator比較

collect clas bold 數據 let 排序類 height webkit tom

1、Comparable 介紹

Comparable 是一個排序接口,如果一個類實現了該接口,說明該類本身是可以進行排序的。註意,除了基本數據類型(八大基本數據類型) 的數組或是List,其余類型的對象,Collections.sort或Arrays.sort 是不支持直接進行排序的,因為對象本身是沒有“順序”的,除非你實現了Comparable 接口或是自定義了Comparable 對象,指定了排序規則,才可以進行排序。

Comparable 源碼就一個方法,

1 public interface Comparable<T> {
2     public
int compareTo(T o); 3 }

泛型T表示要進行比較的對象所屬的類型,compareTo 比較對象之間的值的大小關系,如果該對象小於、等於或大於指定對象,則分別返回負整數、零或正整數。

定義一個對象:

 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),new
Person(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}]

2、Comparator 介紹

如果一個類本身並沒有實現 Comparable 接口,我們想要對他進行排序,就要自定義 Comparator 比較器進行比較,在這個比較器裏面自定義排序的依據。

Comparator 源碼中主要的兩個接口方法:

1 public interface Comparator<T>
2  {
3     int compare(T o1, T o2);
4     boolean equals(Object obj);
5  }

compare 是主要方法,必須要實現,equals 方法可以不實現。compare 中返回比較結果,如果該對象小於、等於或大於指定對象,則分別返回負整數、零或正整數。

定義一個用來排序類,該類並為實現 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}]

3、總結比較

Comparable 在類的內部定義排序規則,Comparator 在外部定義排序規則,Comparable 相當於“內部排序器”,Comparator 相當於“外部排序器”,前者一次定義即可,後者可以在不修改源碼的情況下進行排序,各有所長。

Java中Comparable和Comparator比較