今天有人問我這個面試問題:排序不可比較的元素的列表
如果我有一個
Person
類name
,age
和salary
領域,我把這個Person
100個新的實例在ArrayList
,然後做Collections.sort(list)
,那麼列表將按什麼參數排序?
我明白,我需要有Person
類實現Comparable
,然後覆蓋compareTo
,但如果我不這樣做,會發生什麼?
今天有人問我這個面試問題:排序不可比較的元素的列表
如果我有一個
Person
類name
,age
和salary
領域,我把這個Person
100個新的實例在ArrayList
,然後做Collections.sort(list)
,那麼列表將按什麼參數排序?
我明白,我需要有Person
類實現Comparable
,然後覆蓋compareTo
,但如果我不這樣做,會發生什麼?
它不會編譯:Collections.sort
的單參數版本需要Comparable
s的列表。具體而言,List<T>
其中T
實施Comparable<? super T>
。
作爲集合API狀態:
public static <T extends Comparable<? super T>> void sort(List<T> list)
對指定列表按升序進行,根據其元素的自然順序。列表中的所有元素都必須實現Comparable接口。此外,列表中的所有元素必須相互可比(即,e1.compareTo(e2)不得爲列表中的任何元素e1和e2拋出ClassCastException)。
是可以排序的集合未做元素實現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)方法調用後列表中的排序。
這看起來似乎是合理的,它應該可以工作,但是我在排序方法上遇到錯誤: 方法排序(列表
如果Person
類不執行Comparable<Person>
,則編譯器會通知你):
綁定不匹配:用的一般方法
Collections
類型的sort(List<T>)
不適用於參數(List<Person>)
。推斷類型Person
不是有界參數<T extends Comparable<? super T>>
的有效替代。
(如果你碰巧有一個Comparator<Person>
躺在身邊,Collections.sort(myList, myComparator)
將通過比較指定的順序排序。)
http://docs.oracle.com/javase/7/docs/api /java/util/Collections.html#sort(java.util.List) – kosa