为什么我在代码中的指定位置收到 ConcurrentModificationException?我无法弄清楚我做错了什么... removeMin()
方法用于在列表 pq
中定位 min,将其删除并返回其值
import java.util.Iterator;
import java.util.LinkedList;
public class test1 {
static LinkedList<Integer> list = new LinkedList<Integer>();
public static void main(String[] args) {
list.add(10);
list.add(4);
list.add(12);
list.add(3);
list.add(7);
System.out.println(removeMin());
}
public static Integer removeMin() {
LinkedList<Integer> pq = new LinkedList<Integer>();
Iterator<Integer> itPQ = pq.iterator();
// Put contents of list into pq
for (int i = 0; i < list.size(); i++) {
pq.add(list.removeFirst());
}
int min = Integer.MAX_VALUE;
int pos = 0;
int remPos = 0;
while (itPQ.hasNext()) {
Integer element = itPQ.next(); // I get ConcurrentModificationException here
if (element < min) {
min = element;
remPos = pos;
}
pos++;
}
pq.remove(remPos);
return remPos;
}
}
最佳答案
一旦从中获取迭代器的集合被修改,迭代器就不应被视为可用。 (对于 java.util.concurrent.* 集合类,此限制有所放宽。)
您首先获得 pq
的迭代器,然后修改pq
。一旦修改pq
,迭代器itPQ
不再有效,因此当您尝试使用它时,您会收到 ConcurrentModificationException。
一种解决方案是移动 Iterator<Integer> itPQ = pq.iterator();
到 while
之前环形。更好的方法是完全取消 Iterator 的显式使用:
for (Integer element : pq) {
从技术上讲,for-each 循环在内部使用迭代器,因此无论哪种方式,只有当您不尝试修改 pq
时,此循环才有效。在循环内。
关于java - 为什么我会收到 ConcurrentModificationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44445668/