2014-10-26 72 views
0

我正在Java中實現mergesort。我希望它能夠與可比較的每個對象一起工作。在方法中創建與ArrayList參數相同的ArrayList參數

這裏的代碼

public class MergeSort 
{ 
    public static void sort(ArrayList<? extends Comparable> list) 
    { 
     mergesort(list, 0, list.size() - 1); 
    } 

    private static void mergesort(ArrayList<? extends Comparable> list, int start, int end) 
    { 
     if (start >= end) 
      return; 

     int mid = (start + end)/2; 
     mergesort(list, start, mid); 
     mergesort(list, mid + 1, end); 
     merge(list, start, mid, end); 
    } 

    private static void merge(ArrayList<? extends Comparable> list, int start, int mid, int end) 
    { 
     ArrayList<? extends Comparable> temp = new ArrayList<Comparable>(end - start + 1); 
     int j = mid + 1; 
     for (int i = start; i <= mid; i++) 
     { 
      while (j <= end && list.get(i).compareTo(list.get(j)) > 0) 
      { 
       temp.add(list.get(j)); 
       j++; 
      } 
      temp.add(list.get(i)); 
     } 
     while (j <= end) 
     { 
      temp.add(list.get(j)); 
      j++; 
     } 

     int j = 0; 
     for (int i = start; i <= end; i++) 
     { 
      list.set(i, temp.get(j)); 
      j++; 
     } 
    } 

} 

的問題是,我無法添加元素,以「臨時」陣列,編譯器說,我應該改變溫度可比,但我不能代替從「臨時元素「到」列表「。 據我所知,編譯器認爲該列表可能是整數和臨時浮點數。我如何將「temp」設置爲與「list」相同的類型?

+1

Collections.sort()的簽名是什麼?你應該有同一個。 – 2014-10-26 22:12:01

回答

1

使用泛型類型參數:

public static <T extends Comparable<T>> void sort(List<T> list) { 
    mergesort(list, 0, list.size() - 1); 
} 

private static <T extends Comparable<T>> void mergesort(List<T> list, int start, int end) { 
... 

private static <T extends Comparable<T>> void merge(List<T> list, int start, int mid, int end) { 
    ArrayList<T> temp = new ArrayList<T>(end - start + 1); 
... 

編輯:

要實現最大的靈活性,您可以用<T extends Comparable<? super T>>替換<T extends Comparable<T>>

這將例如允許通過Foo類的元素列表,Foo執行Comparable<Object>。此外,您的功能將與註釋中建議的Collections.sort具有相同的簽名。

+0

現在我覺得很蠢。我曾經使用過泛型。感謝您的清除。 – 2014-10-26 22:32:14

-2

您可以聲明所有列表,如:ArrayList<Comparable>。編譯器不會再抱怨,並且會按照您的預期工作。

然後,你有一個int j宣佈兩次。 :)

+0

*編譯器說,我應該將temp更改爲Comparable,但是不能將元素從「temp」替換爲「list」* – 2014-10-26 22:13:16

+0

我沒有想過更改所有的數組。我檢查瞭解決方案,你不能通過ArrayList 進行排序(ArrayList list) – 2014-10-26 22:42:55

相關問題