小编典典

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

all

我有这个代码:

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


阅读 99

收藏
2022-03-08

共1个答案

小编典典

您的代码有很多问题:

返回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用 a
遍历一次,在适当的索引处listIterator()调用。remove()关于如何在给定范围内生成随机但不同的数字,stackoverflow
存在一些问题。

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

2022-03-08