gpt4 book ai didi

java - Java的Collections.sort如何覆盖待排序的List

转载 作者:行者123 更新时间:2023-11-29 06:01:57 24 4
gpt4 key购买 nike

我正在为一项学校作业编写一段代码,我们正在实现排序算法,但该算法运行良好,我只是想了想为什么一行代码没有像我预期的那样工作到。

调用代码如下所示:

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 会用新的排序列表覆盖列表,而我们的却没有?

sort 方法工作正常,但只是不更新​​调用类中列表 l 的值。我只是好奇 Collections 是如何做到这一点的,解决方案是简单地从 ArraySort.sort 返回一个 List 并执行 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;
}

希望有人能帮我解决这个问题。

最佳答案

我们的想法是改变这个:

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

进入此(不确定顺序是否保留 - 我想它是):

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

关于java - Java的Collections.sort如何覆盖待排序的List,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9787992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com