双迭代器循环

时间:2011-08-10 20:06:45

标签: java list iterator linked-list

所以我在我的代码中有这个循环,需要两个单独工作的迭代器。但是,当它尝试使用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);
    }
}

4 个答案:

答案 0 :(得分:6)

除非您创建允许它的实现,否则在迭代它们时,不能向List的大多数标准实现添加项目。

但是,{p> 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);
    }
}