Подтвердить что ты не робот

Цикл в списке с удалением

    for (String fruit : list)
    {
        if("banane".equals(fruit))
            list.remove(fruit);
        System.out.println(fruit);
    }

Вот цикл с инструкцией удаления. Во время выполнения я получаю некоторое ConcurrentModificationException, ниже выхода консоли:

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:449)
at java.util.AbstractList$Itr.next(AbstractList.java:420)
at Boucle.main(Boucle.java:14)
abricot
banane

Вопрос: Как удалить какой-либо элемент с помощью цикла?

4b9b3361

Ответ 1

Вам нужно использовать итератор напрямую и удалить элемент через этот итератор.

for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
    String fruit = iterator.next();
    if ("banane".equals(fruit)) {
        iterator.remove();
    }
    System.out.println(fruit);
}

Ответ 2

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

for (int i = list.size() - 1; i>=0; i--) {
    String fruit = list.get(i);
    System.out.println(fruit);

    if ("banane".equals(fruit)) {
        list.remove(fruit);
    }
}

Ответ 3

В дополнение к непосредственному использованию Iterator (который я бы рекомендовал) вы также можете хранить элементы, которые хотите удалить в другом списке.

List<String> toRemove = new ArrayList<String>();
for (String fruit : list) {
    if ("banane".equals(fruit))
        toRemove.add(fruit);
    System.out.println(fruit);
}
for (String fruit : toRemove) {
    list.remove(fruit);
}

Помните, я не рекомендую это, это просто альтернатива.:)

Ответ 4

Используйте цикл for и перебирайте коллекцию в обратном порядке. (Это означает, что начните с последнего элемента, а цикл - в первый элемент. Поступая таким образом, вы не получите проблем с помощью индексов, которые меняются из-за удаления элементов из коллекции.

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

Ответ 5

for(Iterator<String> iter = list.iterator(); iter.hasNext(); )
{
   String fruit = iter.next();
   if("banana".equals(fruit))
      iter.remove();
   System.out.println(fruit);
}

Ответ 6

Подобно тому, что предложил Бомбе, но в меньших строках кода, повторяя копию списка, но удаляя из исходного списка;

List<String> temp = new ArrayList<String>(list);
for (String fruit : temp)
{
    if("banane".equals(fruit))
        list.remove(fruit);
    System.out.println(fruit);
}

Лично я думаю, что это выглядит лучше, чем итерация с помощью итератора.

Ответ 7

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
    String s = iter.next();

    if (s.equals("a")) {
        iter.remove();
    }
}

- лучший подход.