我有这个代码:
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
:返回由指定数组支持的固定大小列表。
你不能做到;你不能从它。不能从结构上修改 .add
remove
List
创建一个 ,它支持更快的 。LinkedList
remove
List<String> list = new LinkedList<String>(Arrays.asList(split));
split
从 API :
String.split(String regex)
:围绕给定正则表达式的匹配项拆分此字符串。
|
是一个正则表达式元字符;如果要在文字上拆分,则必须将其转义为 ,作为 Java 字符串文字,它是 。|
|
"\|"
template.split("\|")
与其使用随机索引一次调用一个,不如在该范围内生成足够的随机数,然后使用 遍历一次,在适当的索引处调用。关于如何在给定范围内生成随机但不同的数字,堆栈溢出存在问题。remove
List
listIterator()
remove()
有了这个,您的算法将是.O(N)
这个已经烧了我很多次了。 创建不可修改的列表。
从 Javadoc:返回由指定数组支持的固定大小列表。Arrays.asList
创建具有相同内容的新列表:
newList.addAll(Arrays.asList(newArray));
这将产生一些额外的垃圾,但您将能够改变它。
可能是因为您正在使用不可修改的包装器。
更改此行:
List<String> list = Arrays.asList(split);
到这一行:
List<String> list = new LinkedList<>(Arrays.asList(split));
模板简介:该模板名称为【 Java为什么在尝试从列表中删除元素时会出现 UnsupportedOperationException?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。