ホームページ > Java > &#&チュートリアル > 「Arrays.asList」から要素を削除すると「UnsupportedOperationException」が発生するのはなぜですか?

「Arrays.asList」から要素を削除すると「UnsupportedOperationException」が発生するのはなぜですか?

Patricia Arquette
リリース: 2024-12-22 12:17:16
オリジナル
863 人が閲覧しました

Why Does Removing Elements from `Arrays.asList` Result in an `UnsupportedOperationException`?

「Arrays.asList」リストから削除する際の「UnsupportedOperationException」の解決

提供された Java コードでは、次の場合に例外「UnsupportedOperationException」が発生します。 「Arrays.asList」を使用して作成された「リスト」から要素を削除しようとしています。この問題には複数の根本原因があります。

「Arrays.asList」の固定サイズ リスト

「Arrays.asList」は、提供された配列に基づく「リスト」を返します。 。この「リスト」は固定サイズです。つまり、要素の追加や削除によってその構造を変更することはできません。したがって、「remove」メソッドを呼び出すと「UnsupportedOperationException」が発生します。

「split」メソッドの正規表現の問題

指定されたパラメータ「」を持つ「split」メソッド|"正規表現メタキャラクターとして扱います。リテラル「|」で分割するには、「|」としてエスケープする必要があります。

ランダム要素削除のアルゴリズムが改善されました

「remove」を複数回呼び出すことを避けるためランダム インデックスを使用する場合、より効率的なアプローチは、範囲内で十分な乱数を生成し、対応するインデックスの要素を 1 回のパスで削除することです。 「listIterator」を使用した「リスト」。この最適化により、アルゴリズムの複雑さが O(N) に軽減されます。

改訂されたコード

問題を解決し、改善されたアルゴリズムを実装するには、次のコードを使用できます。 :

import java.util.LinkedList;
import java.util.List;
import java.util.Random;

public static String SelectRandomFromTemplate(String template, int count) {
    String[] split = template.split("\|");
    List<String> list = new LinkedList<String>(Arrays.asList(split));
    Random r = new Random();
    int[] indicesToRemove = new int[list.size() - count];

    for (int i = 0; i < indicesToRemove.length; i++) {
        indicesToRemove[i] = r.nextInt(list.size());
    }

    indicesToRemove = Arrays.sort(indicesToRemove);
    java.util.ListIterator<String> iter = list.listIterator();
    for (int i : indicesToRemove) {
        iter.next();
        iter.remove();
    }

    return StringUtils.join(list, ", ");
}
ログイン後にコピー

この改訂されたコードは上記の問題に対処し、配列から作成された固定サイズの「リスト」を使用し、 「UnsupportedOperationException」を回避するために、ランダムな要素を削除するためのより効率的なアルゴリズム。

以上が「Arrays.asList」から要素を削除すると「UnsupportedOperationException」が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート