ホームページ >Java >&#&チュートリアル >Java で反復中にコレクションを安全に変更するにはどうすればよいですか?

Java で反復中にコレクションを安全に変更するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-09 22:45:15814ブラウズ

How Can I Safely Modify Collections While Iterating in Java?

反復中のコレクションの変更: 総合ガイド

ConcurrentModificationException のようなエラーを回避するために反復中にコレクションを効果的に変更するには、考慮すべき戦略がいくつかあります。 :

集めてRemove

このメソッドには、拡張 for ループ中に削除されるオブジェクトを収集し、反復の完了後にそれらを削除することが含まれます。この手法は、削除が主な目的であるシナリオで特に役立ちます。

List<Book> books = new ArrayList<>();
ISBN isbn = new ISBN("0-201-63361-2");
List<Book> found = new ArrayList<>();

for (Book book : books) {
    if (book.getIsbn().equals(isbn)) {
        found.add(book);
    }
}

books.removeAll(found);

ListIterator の使用

ListIterator は、反復中の項目の削除と追加の両方をサポートします。これにより、リストを変更するときにこれが適切な選択肢になります:

List<Book> books = new ArrayList<>();
ISBN isbn = new ISBN("0-201-63361-2");
ListIterator<Book> iter = books.listIterator();

while (iter.hasNext()) {
    if (iter.next().getIsbn().equals(isbn)) {
        iter.remove();
    }
}

JDK >= 8

Java 8 では、コレクション変更のための追加メソッドが導入されました:

  • removeIf: このメソッドは、指定された要素に一致する要素を削除しますコレクションの述語:
List<Book> books = new ArrayList<>();
ISBN isbn = new ISBN("0-201-63361-2");
books.removeIf(book -> book.getIsbn().equals(isbn));
  • ストリーム API: ストリーム API では、パイプラインを使用して要素をフィルタリングおよび削除できます:
List<Book> books = new ArrayList<>();
ISBN isbn = new ISBN("0-201-63361-2");
List<Book> filtered = books.stream()
                           .filter(book -> book.getIsbn().equals(isbn))
                           .collect(Collectors.toList());

サブリストまたはサブセット

ソートされたリストの場合、サブリストを使用して連続した要素を効率的に削除できます。

List<Book> books = new ArrayList<>();
books.subList(0, 5).clear();

考慮事項

変更の選択方法は、特定のシナリオとコレクションの種類によって異なります。以下に重要な考慮事項をいくつか示します。

  • 「収集と削除」手法は汎用性が高く、あらゆるコレクションで機能します。
  • ListIterator アプローチは効率的ですが、サポートする実装を持つリストにのみ適用できます。
  • 反復子のアプローチは削除をサポートしていますが、普遍的に利用できるわけではない可能性があります。
  • JDK 8 メソッドが提供するものフィルタリングと削除は効率的ですが、新しいコレクションに転送する必要があります。
  • サブリストを使用すると、並べ替えられたリスト内の連続する要素を一括で削除できます。

以上がJava で反復中にコレクションを安全に変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。