我正在爲學校排序編寫一段代碼,我們正在實施排序算法,但算法運行正常,我只是想了解爲什麼一行代碼不會像我期望的那樣工作。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;
}
希望有人能清楚這件事對我來說。
您可以實現它在集合中實現,或者你可以返回一個新的列表,它沒有任何問題。 – MByD 2012-03-20 13:50:26