2013-07-02 30 views
3

今天有人問我這個面試問題:排序不可比較的元素的列表

如果我有一個Personnameagesalary領域,我把這個Person 100個新的實例在ArrayList,然後做Collections.sort(list),那麼列表將按什麼參數排序?

我明白,我需要有Person類實現Comparable,然後覆蓋compareTo,但如果我不這樣做,會發生什麼?

+0

http://docs.oracle.com/javase/7/docs/api /java/util/Collections.html#sort(java.util.List) – kosa

回答

11

它不會編譯:Collections.sort的單參數版本需要Comparable s的列表。具體而言,List<T>其中T實施Comparable<? super T>

3

作爲集合API狀態:

public static <T extends Comparable<? super T>> void sort(List<T> list) 

對指定列表按升序進行,根據其元素的自然順序。列表中的所有元素都必須實現Comparable接口。此外,列表中的所有元素必須相互可比(即,e1.compareTo(e2)不得爲列表中的任何元素e1和e2拋出ClassCastException)。

5

是可以排序的集合未做元素實現Comparable接口,你這樣做

List<YourType> theList = new ArrayList<>(); 
Collections.sort(theList, new Comparator<YourType>(){ 
    public int compare(YourType obj1, YourType obj2) { 
        // this method should return < 0, 0 or > 0 
        // whether obj1 is less than, equal to 
        // or greather than obj2 
        return 0; 
    } 
}); 

/編輯,

如果使用Collections.sort(名單),那麼它只會編譯如果列表是通用的,並且它的元素實現Comparable。如果是這樣,則在每個元素上執行compareTo(Obj)將決定排序(List)方法調用後列表中的排序。

+0

這看起來似乎是合理的,它應該可以工作,但是我在排序方法上遇到錯誤: 方法排序(列表,比較器) (收集,新的比較器(){}) 任何想法,爲什麼這是什麼? – f1v3

0

如果Person類不執行Comparable<Person>,則編譯器會通知你):

綁定不匹配:用的一般方法Collections類型的sort(List<T>)不適用於參數(List<Person>)。推斷類型Person不是有界參數<T extends Comparable<? super T>>的有效替代。

(如果你碰巧有一個Comparator<Person>躺在身邊,Collections.sort(myList, myComparator)將通過比較指定的順序排序。)