2012-03-20 24 views
1

我正在爲學校排序編寫一段代碼,我們正在實施排序算法,但算法運行正常,我只是想了解爲什麼一行代碼不會像我期望的那樣工作。Java的Collections.sort如何覆蓋列表進行排序

調用代碼看起來是這樣的:

List<Integer> l = new LinkedList<Integer>(); 
l.add(new Integer(10)); 
l.add(new Integer(28)); 
l.add(new Integer(4)); 
l.add(new Integer(35)); 
l.add(new Integer(9)); 

ArraySort.sort(l); 
System.out.println(l); 

Collections.sort(l); 
System.out.println(l); 

我會把代碼爲我們的排序以後,但問題是:Collections.sort爲什麼會覆蓋新的排序列表中的列表,而我們不?

排序方法可以正常工作,但不會更新調用類中列表l的值。我只是好奇收集如何做到這一點,解決方案將簡單地返回ArraySort.sort的列表,並執行l = ArraySort.sort,但看起來不太好!

下面是實際排序的代碼:

public static void sort(List l) { 
    mergeSort(l); 
} 

private static List mergeSort(List l) { 
    if (l.size() <= 1) { 
     return l; 
    } 
    List left = new LinkedList(); 
    List right = new LinkedList(); 
    int middle = l.size()/2; 
    for (int i = 0; i < middle; i++) { 
     left.add(l.get(i)); 
    } 
    for (int i = middle; i < l.size(); i++) { 
     right.add(l.get(i)); 
    } 

    left = mergeSort(left); 
    right = mergeSort(right); 

    l = merge(left, right); 
    return l; 
} 

private static List merge(List left, List right) { 
    List result = new LinkedList(); 
    while (left.size() > 0 || right.size() > 0) { 
     if (left.size() > 0 && right.size() > 0) { 
      if ((int) left.get(0) <= (int) right.get(0)) { 
       result.add(left.get(0)); 
       left.remove(0); 
      } else { 
       result.add(right.get(0)); 
       right.remove(0); 
      } 
     } else if (left.size() > 0) { 
      result.add(left.get(0)); 
      left.remove(0); 
     } else if (right.size() > 0) { 
      result.add(right.get(0)); 
      right.remove(0); 
     } 
    } 
    return result; 
} 

希望有人能清楚這件事對我來說。

回答

2

的想法是改變這一點:

l = merge(left, right); 
return l; 

到這個(不知道,如果順序被保存 - 我想這是):

l.clear(); 
l.addAll(merge(left, right)); //no need to return the list, it is the same 
2

它不,它只改變列表內容。

source

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

您可以實現它在集合中實現,或者你可以返回一個新的列表,它沒有任何問題。 – MByD 2012-03-20 13:50:26

2

你並不需要返回一個列表對象,但是這並不能使它錯。

請注意,您對您的列表參數

l = merge(left, right); 

的Java分配一個新的名單經過價值,而不是引用,因此它不具有任何影響,當你從你的方法返回。您必須實際修改傳遞給該方法的列表對象,而不是爲其分配新值。


您是否考慮過在Java中查看實現進行比較?

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collections.java#Collections.sort%28java.util.List%29

相關問題