How to avoid "ConcurrentModificationException" while removing elements from `ArrayList` while iterating it? [duplicate]
Как избежать "ConcurrentModificationException" при удалении элементов из `ArrayList` во время его итерации?
Я пытаюсь удалить некоторые элементы из ArrayList во время итерации следующим образом:
for (String str : myArrayList) { if (someCondition) { myArrayList.remove(str); } }
Конечно, я получаю ConcurrentModificationException при попытке удалить элементы из списка одновременно при итерации myArrayList. Есть ли какое-то простое решение для решения этой проблемы?
В качестве альтернативы ответам всех остальных я всегда делал что-то вроде этого:
List<String> toRemove = newArrayList<String>(); for (String str : myArrayList) { if (someCondition) { toRemove.add(str); } } myArrayList.removeAll(toRemove);
Это позволит избежать необходимости иметь дело с итератором напрямую, но требует другого списка. Я всегда предпочитал этот маршрут по какой-либо причине.
Ответ 3
Пользователь Java 8 может это сделать: list.removeIf(...)
List<String> list = newArrayList<>(Arrays.asList("a", "b", "c")); list.removeIf(e -> (someCondition));
Это приведет к удалению элементов в списке, для которых выполняется someCondition
Ответ 4
Вы должны использовать метод remove () итератора, что означает отсутствие расширенного цикла for:
for (finalIteratoriterator= myArrayList.iterator(); iterator.hasNext(); ) { iterator.next(); if (someCondition) { iterator.remove(); } }