[解決済み] コレクションを反復処理し、ループ内でオブジェクトを削除する際に ConcurrentModificationException を回避する。
2022-03-15 05:01:51
質問
のため、以下のことができないことは周知のとおりです。
ConcurrentModificationException
:
for (Object i : l) {
if (condition(i)) {
l.remove(i);
}
}
しかし、これはどうやらうまくいくときもあれば、そうでないときもあるようです。以下は具体的なコードです。
public static void main(String[] args) {
Collection<Integer> l = new ArrayList<>();
for (int i = 0; i < 10; ++i) {
l.add(4);
l.add(5);
l.add(6);
}
for (int i : l) {
if (i == 5) {
l.remove(i);
}
}
System.out.println(l);
}
もちろん、この結果は
Exception in thread "main" java.util.ConcurrentModificationException
複数のスレッドがやってないのに。とにかく
この問題に対する最善の解決策は何でしょうか?この例外を投げずに、ループの中でコレクションからアイテムを削除するにはどうしたらよいでしょうか?
また、任意の
Collection
である必要はありません。
ArrayList
に依存することはできません。
get
.
解決方法は?
Iterator.remove()
が安全であれば、このように使うことができます。
List<String> list = new ArrayList<>();
// This is a clever way to create the iterator and call iterator.hasNext() like
// you would do in a while-loop. It would be the same as doing:
// Iterator<String> iterator = list.iterator();
// while (iterator.hasNext()) {
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
String string = iterator.next();
if (string.isEmpty()) {
// Remove the current element from the iterator and the list.
iterator.remove();
}
}
なお
Iterator.remove()
は、反復処理中にコレクションを変更する唯一の安全な方法です。
その他の方法
は、イテレーションが進行している間
出典 docs.oracle > コレクションインタフェース
そして同様に、もしあなたが
ListIterator
を作成し
追加
の項目がある場合は
ListIterator#add
を使用することができます。
Iterator#remove
- ができるように設計されています。
あなたの場合は、リストから削除しようとしたわけですが、同じ制約が
put
の中に
Map
の内容を繰り返しながら
関連
-
JavaMailのメール送信が失敗するケースとその説明の分析
-
eclipseにプロジェクトをインポートした後、Editorにmain typeが含まれない問題
-
spring aop アドバイスからの Null 戻り値が、サマリーのプリミティブ戻り値と一致しない。
-
java -serverコマンドで「Error: no `server' JVM at ... jvm.dll」を解決する方法です。
-
テストが見つかりませんでした
-
ブラウザでの大容量ファイルスライスアップロード(Javaサーバサイド実装)
-
[解決済み] Pythonで日付の範囲を繰り返し処理する
-
[解決済み】オブジェクトを含む配列をループして、そのプロパティにアクセスする方法
-
[解決済み】反復処理中にコレクションから要素を削除する
-
[解決済み】javaでリストを逆順で反復処理する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
java.util.NoSuchElementException 原因解析と解決方法
-
アクセス制限について アプリケーションの種類がAPIでない(必要なライブラリの制限)。
-
javaの模造品QQ WeChatのチャットルーム
-
マスキング このリソースにアクセスするには、完全な認証が必要です。
-
が 'X-Frame-Options' を 'deny' に設定しているため、フレーム内にある。
-
自動配線された依存性のインジェクションに失敗しました。
-
Maven Pluginの実行がライフサイクル設定の対象外であるエラーの解決
-
[解決済み] Javaでforeachループでremoveを呼び出す [重複]。
-
[解決済み] `ArrayList` の反復処理中に要素を削除する際に "ConcurrentModificationException" を回避するにはどうすればよいですか?[重複している]。
-
[解決済み】マップの反復処理とマップからの削除【重複あり