【发布时间】:2021-07-24 21:09:04
【问题描述】:
在循环的第一行我得到了错误,但我不明白为什么。从我读到的内容来看,只有当我迭代一个集合并同时尝试修改它时才会发生这种情况,但事实并非如此。
在代码中,list 的类型为 ArrayList<Product>。
void mergeSort() {
mergeSort(0, list.size() - 1); //128
}
private void mergeSort(int p, int r) {
if (p < r) {
int q = (p + r) / 2;
mergeSort(p, q); //133
mergeSort(q + 1, r);
merge(p, q, r); //135
}
}
private void merge(int p, int q, int r) {
List<Product> left = list.subList(p, q);
left.add(Product.PLUS_INFINITE);
List<Product> right = list.subList(q + 1, r);
right.add(Product.PLUS_INFINITE);
int i = 0;
int j = 0;
for (int k = p; k <= r; ++p) {
Product x = left.get(i).compareTo(right.get(j)) <= 0 ? left.get(i++) : right.get(j++); //147
list.set(k, x);
}
}
这是堆栈跟踪:
Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1415)
at java.base/java.util.ArrayList$SubList.get(ArrayList.java:1150)
at ProductList$ProductSort.merge(MainClass.java:147)
at ProductList$ProductSort.mergeSort(MainClass.java:135)
at ProductList$ProductSort.mergeSort(MainClass.java:133)
at ProductList$ProductSort.mergeSort(MainClass.java:128)
at ProductList.sort(MainClass.java:95)
at MainClass.main(MainClass.java:187)
【问题讨论】:
-
获取
subList,然后调用add(这是一种结构变化)气味。 -
@azurefrog 是的,Product 只是我写的一个类,不是来自库。
标签: java