從「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中文網其他相關文章!