我的要求是从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中删除元素?
答案 0 :(得分:1)
孤立地,在remove()
上调用Iterator
是从正在迭代的集合中删除项目时避免ConcurrentModificationException
的正确方法。但是,您有两个 Iterator
在同一ArrayList
上进行迭代。当您在remove()
上致电innerIterator
时,outerIterator
会注意到该列表已更改,并且会引发ConcurrentModificationException
。
在这种情况下,如果SomeOperationOn
表示需要删除该项,则不要立即将其删除,而是将inner
存储在稍后要删除的临时List
项中。在迭代器上的for
循环完成后,调用removeAll
传递此临时列表。