所以我在我的代码中有这个循环,需要两个单独工作的迭代器。但是,当它尝试使用rbIterator.next()时,java会抛出ConcurrentModificationException。我如何阻止这种情况发生? 感谢
Iterator<Road> raIterator = roads.listIterator(0); //I also tried .iterator(), with no avail
while(raIterator.hasNext()){
Road ra = raIterator.next();
Iterator<Road> rbIterator = roads.listIterator(0);
while(rbIterator.hasNext()){
Road rb = rbIterator.next();
//snipped code that adds a road to the list
roads.add(xyz);
}
}
答案 0 :(得分:6)
除非您创建允许它的实现,否则在迭代它们时,不能向List
的大多数标准实现添加项目。
ArrayList
不会看到javadoc。大多数*(可能全部)Java Collections Frameworks List
实现也没有。
解决方案是在迭代之前创建新列表temp
,在迭代时向temp
添加元素,然后将temp
中的所有元素添加到第一个
编辑:使用addAll(temp)
,感谢@Michael Easter
List<Road> temp = new ArrayList<Road>();
for(Road ra : roads){
for (Road rb : roads){
temp.add(xyz);
}
}
roads.addAll(temp);
答案 1 :(得分:1)
如果您使用ListIterator<E>
,则可以添加。你得到异常的原因是b / c(来自javadocs):
此类的迭代器和listIterator返回的迭代器 方法是快速失败的:如果列表在结构上被修改了 创建迭代器之后的时间,除了通过之外的任何方式 迭代器自己删除或添加方法,迭代器会抛出一个 ConcurrentModificationException的。
您不能直接修改列表本身,但可以通过迭代器修改。基础Iterator<E>
类没有添加方法,但是ListIterator<E>
会执行此操作,这是您在调用obj.listIterator()
anywqay时获得的内容。
答案 2 :(得分:0)
我之前遇到过这个问题。这是因为你试图迭代两次相同的事情(道路)。这很危险,因为如果一个迭代器修改了道路,那么另一个迭代器将被抛入一个未知/不可靠的状态。
如果您可以设法使用可以解决此问题的for循环,因为它似乎满足了需求。这取决于道路的类型(你没有包括)。
答案 3 :(得分:0)
您无法使用Iterator。但是,您可以通过List的get()方法直接访问。
此代码可以满足您的需求(并编译并运行正常):
for (int i = 0; i < roads.size(); i++) {
Road ra = roads.get(i);
for (int j = 0; j < roads.size(); j++) {
Road rb = roads.get(i);
//snipped code that adds a road to the list
roads.add(xyz);
}
}