comparable和comparator

comparable和comparator是java中兩個用於比較大小的接口
1、comparable位於java.lang包中,實現該接口的對象表示該對象是“可比較的”,此接口強行對實現它的每個類的對象進行整體排序。該接口定義如下:
public interface Comparable<T> {
    public int compareTo(T o);
}

jdk文檔:實現此接口的對象列表(和數組)可以通過 Collections.sort(和 Arrays.sort)進行自動排序。實現此接口的對象可以用作有序映射中的鍵或有序集合中的元素,無需指定比較器。對於類 C 的每一個 e1 和 e2 來說,當且僅當 e1.compareTo(e2) == 0 與 e1.equals(e2) 具有相同的 boolean 值時,類 C 的自然排序才叫做與 equals 一致。注意,null 不是任何類的實例,即使 e.equals(null) 返回 falsee.compareTo(null) 也將拋出 NullPointerException。建議(雖然不是必需的)最好使自然排序與 equals 一致。這是因爲在使用自然排序與 equals 不一致的元素(或鍵)時,沒有顯式比較器的有序集合(和有序映射表)行爲表現“怪異”。尤其是,這樣的有序集合(或有序映射表)違背了根據 equals 方法定義的集合(或映射表)的常規協定。

2、comparator位於java.util包中,是一個比較器,可以在類的定義之外指定比較規則,在需要排序的地方將比較器傳遞給排序函數即可,定義如下:
public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
}

jdk文檔:強行對某個對象 collection 進行整體排序 的比較函數。可以將 Comparator 傳遞給 sort 方法(如 Collections.sort 或 Arrays.sort),從而允許在排序順序上實現精確控制。還可以使用 Comparator 來控制某些數據結構(如有序 set有序映射)的順序,或者爲那些沒有自然順序的對象 collection 提供排序。排序規則最好也是與equals一致的。

觀察Collections中的排序方法,有兩種方法,一種是直接比較實現了Comparable接口的可比較的對象,一種是對排序的對象指定一個定義了比較規則的比較器。兩種排序方法源碼如下:
public static <T extends Comparable<? super T>> void sort(List<T> list) {
        Object[] a = list.toArray();
        Arrays.sort(a);
        ListIterator<T> i = list.listIterator();
        for (int j=0; j<a. length; j++) {
            i.next();
            i.set((T)a[j]);
        }
}

public static <T> void sort (List<T> list, Comparator<? super T> c) {
        Object[] a = list.toArray();
        Arrays.sort(a, (Comparator)c);
        ListIterator i = list.listIterator();
        for (int j=0; j<a. length; j++) {
            i.next();
            i.set(a[j]);
        }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章