Удалить элемент из ArrayList, используя 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, в то время как externalIterator является Iterator для того же объекта (пользователя).
Есть ли способ удалить элемент из ArrayList с помощью ListIterator в цикле внутри цикла?
1 ответ
В изоляции, звонит remove()
на Iterator
это правильный способ избежать ConcurrentModificationException
при удалении элемента из коллекции, которую вы повторяете. Тем не менее, у вас есть два Iterator
перебирая то же самое ArrayList
, Когда вы звоните remove()
на innerIterator
, outerIterator
замечает, что список изменился, и выбрасывает ConcurrentModificationException
,
В этом случае, если SomeOperationOn
указывает, что элемент должен быть удален, а затем вместо того, чтобы удалить его, сохраните inner
во временном List
из предметов, которые будут удалены позже. После for
цикл на итераторах завершается, звоните removeAll
прохождение этого временного списка.