一尘不染

Java尝试从列表中删除元素时,为什么会出现UnsupportedOperationException?

java

我有以下代码:

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


阅读 370

收藏
2020-03-01

共1个答案

一尘不染

你的代码有很多问题:

Arrays.asList返回一个固定大小的列表

从API:

Arrays.asList:返回指定数组支持的固定大小的列表。

你不能add做到 你不能remove。你无法在结构上修改List

Fix

创建一个LinkedList,支持更快remove

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

关于split正则表达式

从API:

String.split(String regex):在给定正则表达式的匹配项周围拆分此字符串。

|是正则表达式元字符;如果要拆分文字|,则必须将其转义\|为Java字符串文字"\\|"

固定:

template.split("\\|")

关于更好的算法

与其remove一次用一个随机索引调用一个数字,不如生成一个足够的范围内的随机数,然后用List一次遍历一次listIterator(),并remove()在适当的索引上调用,这更好。关于如何在给定范围内生成随机但不同的数字,有一些关于stackoverflow的问题。

这样,你的算法将是O(N)

2020-03-01