2013-01-14 60 views
3

我無法理解方法實現和Collections.sort方法的邏輯。這裏是我發現的方法實現,Collections.sort實現

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]); 
    } 
    } 

首先這種方法的返回類型是void。在方法簽名中做什麼<T extends Comparable<? super T>>

這裏使用Array.sort的目的是什麼?

另外一旦我們實現了比較或比較器,其中我們寫的比較或compareTo方法邏輯考慮了什麼?

+0

Arrays.sort使用改性快速排序算法排序的array.List被轉換爲陣列,並使用排序()在陣列類所提供的方法來分類排序後的數組放回到原始列表中。因此不需要返回類型 – Renjith

+0

@Renjith:'Arrays.sort(T [])'不使用quicksort,它不穩定;它使用Timsort,這是一個修改後的mergesort,真的。 –

+0

@Louis wasserman http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#sort(short []) – Renjith

回答

12

請注意泛型類型出現的地方:

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

它基本上聲明並提出限制在泛型類型T。在該特定情況下它意味着:T必須擴展Comparable<F>其中F必須T型或超類型的它的。這意味着大公如果你有以下類別:

class Animal {} 

class Dog extends Animal implements Comparable<Animal> { 
    //... 
} 

您還可以通過List<Dog>Collections.sort()(注意Dog實現Comparable<Animal>,不Comparable<Dog>像往常一樣)。


Arrays.sort()被使用,因爲這是實施排序算法的地方。如果收集不是隨機訪問,則需要從收集到陣列的防禦性副本服從合同並避免次最佳運行時間。

一些列表,如LinkedList的隨機訪問(按索引)性能差,這使得大多數排序算法很慢(範圍在O(n^2))。最好防禦性地複製整個集合並對陣列進行排序,因爲O(n + nlogn + n)仍然是O(nlogn) - 如果您獲得大O符號)。

+0

我還沒有得到類Dog Extension Animal implements Comparable part?爲什麼我們不能上課狗延伸Animal implements Comparable ? – FrankD

+0

@FrankD:事實上,在大多數情況下,「可比較的」將是更好的選擇。但是,如果出於某種原因實現「Comparable 」,'Collections.sort()'仍然可以工作(編譯)。如果它只是簡單地聲明'> –

1
What is <T extends Comparable<? super T>> 

這是在List<T>中指定T的類型。閱讀Type Inference上的本教程。

+1

[泛型方法頁面](http://docs.oracle.com/javase/tutorial/java/generics/boundedTypeParams.html)可能更合適。 –

1

首先這種方法的返回類型是void。方法簽名中的>是什麼?

是,你在你的方法使用泛型類型,T只能是它實現java.util.Comparable的對象。

例如,如果你想一個List<String>傳遞給排序方法它會編譯爲java.lang.String實現java.lang.Comparable,但如果你通過List<Animal>你會得到一個編譯錯誤,除非Animal實現java.lang.comparable

4

的方式Collections.sort作品是它實際上需要該集合的底層數組,並且調用排序方法來對實際元素進行排序。 Java使用的排序算法是閃電般的快速Timsort

該方法返回void,因爲它將收集就地排序。也就是說,它修改了通過對其元素進行排序將它作爲參數提供給它的集合。返回已分類的副本會浪費資源。

+1

實際上,它調用了Arrays類中的靜態排序方法。數組對象在Java中沒有自己的排序方法。此外,集合不(通常/必然)具有「底層數組」 - 相反,從集合創建一個數組。 –

2

所有這些方法的返回類型的首先是無效

因爲它就地實現。傳遞給方法列表進行排序

什麼是<T extends Comparable<? super T>>確實在方法簽名?

比較Comparable接口的類型T和它的子節點的結果。

Object [] a = list.toArray();

將列表轉換爲普通數組。

這裏使用Array.sort的目的是什麼?

排列數組。

i.set((T)a [j]);

分配到列表中排序的順序從元件陣列