[解決済み] リストから要素を削除しようとすると、UnsupportedOperationExceptionが発生するのはなぜですか?
2022-01-30 09:26:06
質問
このようなコードがあります。
public static String SelectRandomFromTemplate(String template,int count) {
String[] split = template.split("|");
List<String> list=Arrays.asList(split);
Random r = new Random();
while( list.size() > count ) {
list.remove(r.nextInt(list.size()));
}
return StringUtils.join(list, ", ");
}
これが分かるんです。
06-03 15:05:29.614: ERROR/AndroidRuntime(7737): java.lang.UnsupportedOperationException
06-03 15:05:29.614: ERROR/AndroidRuntime(7737): at java.util.AbstractList.remove(AbstractList.java:645)
これはどうするのが正しいのでしょうか?Java.15
どのように解決するのですか?
あなたのコードにはかなり多くの問題があります。
について
Arrays.asList
固定サイズのリストを返す
APIから
Arrays.asList
: を返します。 サイズ固定リスト 指定された配列にバックアップされます。
はできません。
add
を、それに対して
remove
を作成します。を構造的に変更することはできません。
List
.
修正
を作成します。
LinkedList
をサポートし、より高速な
remove
.
List<String> list = new LinkedList<String>(Arrays.asList(split));
について
split
正規表現
APIから
String.split(String regex)
: この文字列を、指定された文字列にマッチする箇所で分割します。 正規表現 .
|
は正規表現のメタキャラクタであり、リテラルな
|
にエスケープする必要があります。
\|
であり、Java の文字列リテラルとしては
"\\|"
.
修正する
template.split("\\|")
より良いアルゴリズムについて
を呼び出す代わりに
remove
をランダムなインデックスで一度に生成し、その範囲内で十分な数の乱数を生成し、さらに
List
を使って一度だけ
listIterator()
を呼び出す。
remove()
を適当なインデックスで指定します。stackoverflowには、与えられた範囲内でランダムだが明確な数を生成する方法についての質問があります。
この場合、アルゴリズムは次のようになります。
O(N)
.
関連
-
[解決済み】Javaメソッドスタブ
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] リストの最後の要素を取得する方法
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み] リストの要素数を取得する方法
-
[解決済み] リストからランダムに項目を選択するにはどうすればよいですか?
-
[解決済み] なぜlist.join(string)ではなくstring.join(list)なのでしょうか?
-
[解決済み] インデックスを指定してリストから要素を削除する方法
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] ハッシュマップのキーを指定して、値を更新するには?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Android Studio クラス org.codehaus.groovy.runtime.InvokerHelper を初期化できませんでした。
-
[解決済み] java.sql.SQLException: ユーザー 'root'@'localhost' (using password: YES) のためのアクセスが拒否されました。
-
[解決済み] hibernate のプロパティが見つかりません。
-
[解決済み】文字列中の � を置換する方法
-
[解決済み】java.io.IOException: 壊れたパイプ
-
[解決済み】破損したjarファイル
-
[解決済み】Javaのswitch文。定数式が必要だが、定数である
-
[解決済み】Javaの未処理例外について
-
[解決済み】どういう意味か。Serializableクラスがstatic final serialVersionUIDフィールドを宣言していないとは?重複している] [重複している] [重複している] [重複している
-
[解決済み】CreateProcess error=2, The system cannot find file specified.