从“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中文网其他相关文章!