「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 サイトの他の関連記事を参照してください。