2012-08-09 68 views
2

我對Java中的泛型使用非常新穎。Collections實用類中實現排序功能的比較

遇到以下功能Collections.java類排序

// Sorting based on 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]); 
    } 
} 


// Sorting based on Comparator 
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]); 
    } 
} 

我想了解的是:

  1. 爲什麼是基於Comparable爲什麼原料ListIteratorListIterator在排序函數參數用於基於Comparator的分類功能?

  2. for循環爲什麼需要排序功能基於Comparable類型轉換(到T),爲什麼基於Comparator鑄造不for循環排序函數的必要嗎?

我覺得下面的代碼將有更多的類型安全的比較基於排序功能:

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

回答

3

爲什麼生的ListIterator是基於比較的排序函數中使用。

不能創建? super T[]類型的數組所以而是創建一個Object[],並從那裏使用原始類型。

在for循環中需要排序功能基於可比性,爲什麼類型轉換(以T)爲什麼基於比較

在第一種情況下,轉換並不是在某種功能的環路必要你有ListIterator<T>哪些只能set(T),在第二種情況下你有ListIterator可以設置任何對象。

+0

假設輸入列表已被參數化,在第二種情況下允許設置任何對象是不是一個錯誤? – user1586907 2012-08-09 09:08:43

+0

這是如果你沒有檢查已經作爲參數的類型。 – 2012-08-09 09:10:20

+0

好的,謝謝彼得澄清事情 – user1586907 2012-08-10 11:33:19