首頁 > Java > java教程 > 為什麼從'Arrays.asList”中刪除元素會導致'UnsupportedOperationException”?

為什麼從'Arrays.asList”中刪除元素會導致'UnsupportedOperationException”?

Patricia Arquette
發布: 2024-12-22 12:17:16
原創
930 人瀏覽過

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」對於隨機索引,更有效的方法是在範圍內產生足夠的隨機數,並使用“列表迭代器”。此最佳化將演算法的複雜度降低到 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板