所以我的代码中有这个循环,它需要两个单独工作的迭代器。但是,当java尝试使用rbIterator.next()时,它会抛出一个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);
}
}
发布于 2011-08-10 20:11:46
您不能在迭代时将项添加到List
的大多数标准实现中,除非您创建了一个允许这样做的实现!
但是,ArrayList
没有看到javadoc。大多数*(也许是全部) Java Collections框架的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);
发布于 2011-08-10 20:39:55
如果您使用ListIterator<E>
代替,您将能够添加。您得到异常的原因是b/c (来自javadoc):
这个类的迭代器和listIterator方法返回的迭代器是快速失效的:如果在迭代器创建之后的任何时候对列表进行了结构化修改,除了通过迭代器自己的remove或add方法以外的任何方式,迭代器都将抛出ConcurrentModificationException。
您不能直接修改列表本身,但可以通过迭代器进行修改。基类Iterator<E>
没有add方法,但ListIterator<E>
有,这是当您调用obj.listIterator()
anywqay时得到的方法。
发布于 2011-08-10 20:09:18
我以前遇到过这个问题。这是因为您正在尝试对同一事物(道路)进行两次迭代。这很危险,因为如果一个迭代器修改了路径,那么另一个迭代器就会进入未知/不可靠的状态。
如果你能设法使用一个for循环来解决这个问题,因为它似乎满足了需求。这将取决于道路的类型(您没有包括在内)。
https://stackoverflow.com/questions/7017067
复制