При удалении внутри foreach, сделайте мы должны отступить

Возьмите этот код Java:

for (ContactsReduced curContact : allcontacts) {
 ..........
 allcontacts.remove(curContact);
}

Я делаю на основе условия удаление, foreach пропустит следующий объект в порядке, и мы должны отступить (так или иначе)?

7
задан Pentium10 17 May 2010 в 08:25
поделиться

5 ответов

Этот код не работает с большинством коллекций - кроме нескольких коллекций, таких как в java.util.concurrent , изменение коллекции во время итерации по ней не поддерживается.

Несколько вариантов:

  • Получить и использовать итератор явно (вызвать iterator () в коллекции) вместо расширенного цикла for и вызвать iterator.remove () , чтобы удалить элемент
  • Используйте простой цикл for, либо двигаясь вперед и отступая после удаления, либо двигаясь назад от конца
  • Сохраняйте отдельный список элементов для удаления, а затем удаляйте их после итерация
8
ответ дан 6 December 2019 в 21:11
поделиться

Определенно не рекомендуется вмешиваться в коллекцию во время ее итерации. Я не уверен, позволяет ли это Java; это может вызвать исключение. Я знаю, что C # ...

0
ответ дан 6 December 2019 в 21:11
поделиться

Итератор завершится с ошибкой ConcurrentModificationException. Так устроен фреймворк коллекции.

0
ответ дан 6 December 2019 в 21:11
поделиться

Посмотрите раздел об итераторах в учебнике по интерфейсу коллекции

Используйте Iterator вместо конструкции for-each, когда вам нужно удалить текущий элемент. Конструкция for-each скрывает итератор, поэтому вы не можете вызвать remove. Поэтому конструкцию for-each нельзя использовать для фильтрации.

Обратите внимание, что Iterator.remove - единственный безопасный способ изменить коллекцию во время итерации

3
ответ дан 6 December 2019 в 21:11
поделиться
List<Integer> al = new ArrayList<Integer>();
for(int i=0;i<10;i++){
  al.add(i);
}
for(Integer x:al){
  al.remove(x);
  System.out.println(al);
}

Вопрос интересный, поэтому я попробовал его в своей системе, и вот что я получил.

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
    at java.util.AbstractList$Itr.next(Unknown Source)
    at test.Main.main(Main.java:17)
1
ответ дан 6 December 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: