26

となることは避けたいConcurrentModificationException。どうすればいいですか?

4

5 に答える 5

54

ListIterator反復自体中に remove/add メソッドをサポートする を使用できます。

ListIterator<Book> iter = books.listIterator();
while(iter.hasNext()){
    if(iter.next().getIsbn().equals(isbn)){
        iter.add(new Book(...));
    }
}
于 2012-07-24T04:53:52.667 に答える
13

イテレータを使用する代わりに、インデックスで for ループを使用できます。例えば:

int originalLength = list.length();
for (int i = 0; i < originalLength; i++) {
  MyType mt = list.get(i);
  //... processing
  //... insertions
}
于 2012-07-24T04:43:28.163 に答える
7

を使用しListIteratorます。これらのいずれかを任意の種類のリストから取得できますが、効率のためにLinkedList.

import java.util.*;
class TestListIterator {
  public static void main(String[]args) {
    List<Integer> L = new LinkedList<Integer>();
    L.add(0);
    L.add(1);
    L.add(2);
    for (ListIterator<Integer> i = L.listIterator(); i.hasNext(); ) {
      int x = i.next();
      i.add(x + 10);
    }
    System.out.println(L);
  }
}

印刷し[0, 10, 1, 11, 2, 12]ます。

于 2012-07-24T04:52:53.073 に答える
2

新しいリストを作成し、そのリストに入力します。

List<MyType> originalList = ...
List<MyType> newList = new ArrayList<>(originalList);

for(MyType type : originalList)
{
  // Some decisions
  newList.add(new MyType());
}
于 2012-07-24T04:35:33.940 に答える
2

上記の例外を回避するには、3 つの方法があります

  1. リストを配列に変換してから、配列を反復処理できます。このアプローチは、小規模または中規模のリストには適していますが、リストが大きい場合はパフォーマンスに大きく影響します。

  2. 同期ブロックに入れることで、反復中にリストをロックできます。マルチスレッドの利点が失われるため、この方法はお勧めしません。

  3. JDK1.5 以降を使用している場合は、ConcurrentHashMap および CopyOnWriteArrayList クラスを使用できます。推奨されるアプローチです。

于 2012-07-24T04:37:33.143 に答える