gpt4 book ai didi

java - 为什么在尝试从列表中删除元素时会收到 UnsupportedOperationException?

转载 作者:太空宇宙 更新时间:2023-11-04 10:51:25 28 4
gpt4 key购买 nike

我有这个代码:

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: Returns a fixed-size list backed by the specified array.

您无法添加到其中;您无法从中删除。您无法从结构上修改List

修复

创建一个LinkedList,它支持更快的删除

List<String> list = new LinkedList<String>(Arrays.asList(split));
<小时/>

split 采用正则表达式

来自 API:

String.split(String regex): Splits this string around matches of the given regular expression.

| 是正则表达式元字符;如果要分割文字 |,则必须将其转义为 \|,作为 Java 字符串文字是 "\\|"

修复:

template.split("\\|")
<小时/>

更好的算法

与其使用随机索引一次调用 remove 一个,不如在范围内生成足够的随机数,然后使用 listIterator() 遍历 List 一次,在适当的索引处调用 remove()。 stackoverflow 上有关于如何在给定范围内生成随机但不同的数字的问题。

有了这个,你的算法将是O(N)

关于java - 为什么在尝试从列表中删除元素时会收到 UnsupportedOperationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47799086/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com