3

これを行う間、回避するための最善の方法について、矛盾するアドバイスを見つけConcurrentModificationExceptionています。

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

Iterator私はa の代わりにan を使用し、そのメソッドListを呼び出すことに傾いています。remove

それはここで最も理にかなっていますか?

4

5 に答える 5

5

はい、イテレータを使用します。次に、その remove メソッドを使用できます。

  for (Iterator<Apple> appleIterator = Apples.iterator(); appleIterator.hasNext();) {
     Apple apple = appleIterator.next();
     if (apple.isTart()) {
        appleIterator.remove();
     }
  }
}
于 2011-05-06T18:11:20.713 に答える
2

ConcurrentModificationException を取得している場合は、複数のスレッドがある可能性があります。

したがって、完全な答えには、 Iterator.remove() の使用コレクションへのアクセスの同期の両方が含まれます。

例 (リストを変更する可能性のあるすべてのスレッドによってロックが同期される場合):

synchronized ( lock ) {
   List<Apple> apples = appleCart.getApples();
   for ( Iterator<Apple> it = apples.iterator(); it.hasNext(); )
   {
      Apple a = it.next(); 
      if ( a.hasWorm() ) {
         it.remove();
      }
   }
}
于 2011-05-06T18:17:47.887 に答える
1
List<Apple> apples = appleCart.getApples();
for (Iterator<Apple> appleIterator = apples.iterator(); appleIterator.hasNext();)
{
   Apple apple = appleIterator.next();
   if ( apple.isYucky() ) {
     appleIterator.remove();
   }
}
于 2011-05-06T18:12:41.817 に答える
0

削除するアイテムのリストを保持し、ループの後にそれらを削除できます。

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);
于 2011-05-06T18:15:27.917 に答える