为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在尝试从列表中删除元素时会得到一个UnSuptedOperationException?

为什么在尝试从列表中删除元素时会得到一个UnSuptedOperationException?

斯蒂芬大帝 2019-06-29 17:23:23
为什么在尝试从列表中删除元素时会得到一个UnSuptedOperationException?我有个密码: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.UnsupportedOperationException06-03 15:05:29.614: ERROR/AndroidRuntime(7737):     at java.util.AbstractList.remove(AbstractList.java:645)这怎么才是正确的呢?Java.15
查看完整描述

3 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

代码中存在不少问题:

在……上面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)*将此字符串拆分为给定的匹配项。正则表达式.

|是regex元字符;如果要在文字上拆分|,你必须逃到\|,它作为Java字符串文本是"\\|".

修正:

template.split("\\|")

关于更好的算法

而不是打电话remove一次一个随机索引,最好在范围内生成足够多的随机数,然后遍历List一次listIterator(),呼叫remove()在适当的指数。在堆栈溢出的问题上,如何在给定的范围内生成随机但不同的数字。

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


查看完整回答
反对 回复 2019-06-29
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

这个已经烧了我很多次了。Arrays.asList创建不可修改的列表。从Javadoc:返回定尺寸由指定数组支持的列表。

创建一个具有相同内容的新列表:

newList.addAll(Arrays.asList(newArray));

这将创建一个额外的垃圾,但您将能够改变它。


查看完整回答
反对 回复 2019-06-29
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

可能是因为你和不可修改的包装器.

更改这一行:

List<String> list = Arrays.asList(split);

这一行:

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


查看完整回答
反对 回复 2019-06-29
  • 3 回答
  • 0 关注
  • 372 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号