gpt4 book ai didi

java - 合并排序代码中的 ConcurrentModificationException

转载 作者:太空宇宙 更新时间:2023-11-04 09:04:47 25 4
gpt4 key购买 nike

我是 Java 和一般编码的初学者。我正在尝试为我创建的名为 Member 的类的 ArrayList 编写合并排序代码,但该代码遇到 ConcurrentModificationException。 isLargerThan 是我用来比较成员的自定义方法。我做错了什么?

  public static void mergeSort(List<Member> list) {
List<Member> another1 = new ArrayList<Member>();
another1 = list.subList(0, list.size() / 2);
List<Member> another2 = new ArrayList<Member>();
another2 = list.subList(list.size() / 2, list.size());
if (another1.size() > 1) {
mergeSort(another1);
} if (another2.size() > 1) {
mergeSort(another2);
}
merge(list, another1, another2);
}

public static void merge(List<Member> goal, List<Member> list1, List<Member> list2) {
if (isLargerThan(list2.get(0), list1.get(0))) {
goal = list1;
goal.addAll(list2);
} else {
goal = list2;
goal.addAll(list1);
}
}

编辑:

我已将合并方法更改为:

  public static void merge(List<Member> goal, List<Member> list1, List<Member> list2) {
if (isLargerThan(list2.get(0), list1.get(0))) {
goal.clear();
goal.addAll(list1);
goal.addAll(list2);
} else {
goal.clear();
goal.addAll(list2);
goal.addAll(list1);
}
}

该错误现在出现在第一行 goal.addAll(list1); 上,而之前它出现在 } if (another2.size() > 1) { 行上。

最佳答案

子列表不是一个实际的列表,它只是将当前列表的引用以及开始值和结束值存储到其中。

因此,merge 函数的 goallist1list2 内部引用同一个列表。

当您执行 goal.addAll(list2);goal.addAll(list1); 时,您尝试在同一列表上执行读写操作,导致 ConcurrentModificationException

要解决此问题,您可以手动将一个列表复制到另一个列表中,而不是使用子列表。或者创建一个单独的列表来合并结果。

关于java - 合并排序代码中的 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60344118/

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