gpt4 book ai didi

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

转载 作者:bug小助手 更新时间:2023-10-28 01:35:42 26 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.

你不能添加到它;你不能从中 remove 。您不能在结构上修改 List

修复

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

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

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

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

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