Есть ли в Java лучшая практика для удаления элемента списка во время итерации по списку? - PullRequest
3 голосов
/ 06 мая 2011

Я нахожу противоречивый совет относительно лучшего способа избежать ConcurrentModificationException при этом:

    List<Apple> Apples = appleCart.getApples();
    for (Apple apple : Apples)
    {
        delete(apple);
    }

Я склоняюсь к использованию Iterator вместо List и вызываю его remove метод.

Имеет ли это здесь смысл?

Ответы [ 5 ]

5 голосов
/ 06 мая 2011

Да, используйте итератор. Тогда вы можете использовать метод удаления.

  for (Iterator<Apple> appleIterator = Apples.iterator(); appleIterator.hasNext();) {
     Apple apple = appleIterator.next();
     if (apple.isTart()) {
        appleIterator.remove();
     }
  }
}
2 голосов
/ 06 мая 2011

Если вы получаете исключение ConcurrentModificationException, у вас, вероятно, несколько потоков.

Таким образом, полный ответ включает в себя как использование Iterator.remove () , так и для синхронизации доступа к коллекции.

Например (где lock синхронизируется всеми потоками, которые могут изменять список):

synchronized ( lock ) {
   List<Apple> apples = appleCart.getApples();
   for ( Iterator<Apple> it = apples.iterator(); it.hasNext(); )
   {
      Apple a = it.next(); 
      if ( a.hasWorm() ) {
         it.remove();
      }
   }
}
1 голос
/ 06 мая 2011
List<Apple> apples = appleCart.getApples();
for (Iterator<Apple> appleIterator = apples.iterator(); appleIterator.hasNext();)
{
   Apple apple = appleIterator.next();
   if ( apple.isYucky() ) {
     appleIterator.remove();
   }
}
0 голосов
/ 26 октября 2018

Начиная с Java 8 теперь вы можете делать это: apples.removeIf(apple -> apple.equals(this))

0 голосов
/ 06 мая 2011

Вы можете сохранить список элементов для удаления, а затем удалить их после цикла:

List<Apple> apples = appleCart.getApples();
List<Apple> badApples = new ArrayList<Apple>();
for (Apple apple : apples) {
    if (apple.isBad()) {
        badApples.add(apple);
    } else {

    eat(apple);
}

apples.removeAll(badApples);
...