在循环内部循环中使用ListIterator从ArrayList中删除元素

时间:2015-07-16 21:35:54

标签: java arraylist collections iterator listiterator

我的要求是从ArrayList中删除:

ArrayList<User> user = new ArrayList<User>();

ListIterator<User> outerIterator = null;
ListIterator<User> innerIterator = null;

User outer = null;
User inner = null;

for(outerIterator = user.listIterator(); outerIterator.hasNext();) {
    outer = outerIterator.next();
    for(innerIterator = user.listIterator(); innerIterator.hasNext();) {
        inner = innerIterator.next();
        if(SomeOperationOn(outer,inner)) {
            innerIterator.remove();
        }
    }
}

上面的代码是异常

Exception in thread "main" java.util.ConcurrentModificationException

正如预期的那样,因为我试图从innerIterator中删除,而outerIterator是同一个对象(用户)上的Iterator。

有没有办法在循环内部使用ListIterator从ArrayList中删除元素?

1 个答案:

答案 0 :(得分:1)

孤立地,在remove()上调用Iterator是从正在迭代的集合中删除项目时避免ConcurrentModificationException的正确方法。但是,您有两个 Iterator在同一ArrayList上进行迭代。当您在remove()上致电innerIterator时,outerIterator会注意到该列表已更改,并且会引发ConcurrentModificationException

在这种情况下,如果SomeOperationOn表示需要删除该项,则不要立即将其删除,而是将inner存储在稍后要删除的临时List项中。在迭代器上的for循环完成后,调用removeAll传递此临时列表。