となることは避けたいConcurrentModificationException
。どうすればいいですか?
質問する
48120 次
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 つの方法があります
リストを配列に変換してから、配列を反復処理できます。このアプローチは、小規模または中規模のリストには適していますが、リストが大きい場合はパフォーマンスに大きく影響します。
同期ブロックに入れることで、反復中にリストをロックできます。マルチスレッドの利点が失われるため、この方法はお勧めしません。
JDK1.5 以降を使用している場合は、ConcurrentHashMap および CopyOnWriteArrayList クラスを使用できます。推奨されるアプローチです。
于 2012-07-24T04:37:33.143 に答える