猿问

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

为什么在尝试从列表中删除元素时会得到一个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


斯蒂芬大帝
浏览 373回答 3
3回答

牛魔王的故事

代码中存在不少问题:在……上面Arrays.asList返回一个固定大小的列表来自API:Arrays.asList*返回固定尺寸列表由指定的数组支持。你不能add你不能remove从那里。您不能在结构上修改List.固定创建一个LinkedList,它支持更快的remove.List<String>&nbsp;list&nbsp;=&nbsp;new&nbsp;LinkedList<String>(Arrays.asList(split));在……上面split取正则来自API:String.split(String regex)*将此字符串拆分为给定的匹配项。正则表达式.|是regex元字符;如果要在文字上拆分|,你必须逃到\|,它作为Java字符串文本是"\\|".修正:template.split("\\|")关于更好的算法而不是打电话remove一次一个随机索引,最好在范围内生成足够多的随机数,然后遍历List一次listIterator(),呼叫remove()在适当的指数。在堆栈溢出的问题上,如何在给定的范围内生成随机但不同的数字。有了这个,您的算法将是O(N).

至尊宝的传说

这个已经烧了我很多次了。Arrays.asList创建不可修改的列表。从Javadoc:返回定尺寸由指定数组支持的列表。创建一个具有相同内容的新列表:newList.addAll(Arrays.asList(newArray));这将创建一个额外的垃圾,但您将能够改变它。

收到一只叮咚

可能是因为你和不可修改的包装器.更改这一行:List<String>&nbsp;list&nbsp;=&nbsp;Arrays.asList(split);这一行:List<String>&nbsp;list&nbsp;=&nbsp;new&nbsp;LinkedList<>(Arrays.asList(split));
随时随地看视频慕课网APP

相关分类

Java
我要回答