Удалить элемент из 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 прохождение этого временного списка.

Другие вопросы по тегам