Вопрос-ответ

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. Есть ли какое-то простое решение для решения этой проблемы?

Переведено автоматически
Ответ 1

Используйте Iterator и вызовите remove():

Iterator<String> iter = myArrayList.iterator();

while (iter.hasNext()) {
String str = iter.next();

if (someCondition)
iter.remove();
}
Ответ 2

В качестве альтернативы ответам всех остальных я всегда делал что-то вроде этого:

List<String> toRemove = new ArrayList<String>();
for (String str : myArrayList) {
if (someCondition) {
toRemove.add(str);
}
}
myArrayList.removeAll(toRemove);

Это позволит избежать необходимости иметь дело с итератором напрямую, но требует другого списка. Я всегда предпочитал этот маршрут по какой-либо причине.

Ответ 3

Пользователь Java 8 может это сделать: list.removeIf(...)

    List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
list.removeIf(e -> (someCondition));

Это приведет к удалению элементов в списке, для которых выполняется someCondition

Ответ 4

Вы должны использовать метод remove () итератора, что означает отсутствие расширенного цикла for:

for (final Iterator iterator = myArrayList.iterator(); iterator.hasNext(); ) {
iterator.next();
if (someCondition) {
iterator.remove();
}
}
java list arraylist