我有这样的代码:

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()在内部使用固定大小的数组。 你不能动态地添加或删除thisArrays.asList()

使用这个

Arraylist<String> narraylist=new ArrayList(Arrays.asList());

在naraylist中,您可以轻松地添加或删除项目。

其他回答

这个UnsupportedOperationException会在你试图对集合执行一些不允许的操作时出现,在你的情况下,当你调用数组时。asList不返回java.util.ArrayList。它返回一个java.util。数组$ArrayList是一个不可变列表。你不能向它添加,也不能从它删除。

Arraylist narraylist = arrays . aslist ();//返回不可变数组列表 使其可变的解决方案将是: Arraylist naraylist =new Arraylist (Arrays.asList());

你的代码有很多问题:

在数组。返回一个固定大小的列表

来自API:

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

你不能再加了;你不能从中移走。您不能在结构上修改List。

Fix

创建一个LinkedList,支持更快的删除。

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

在分割取正则表达式时

来自API:

字符串。split(String regex):根据给定正则表达式的匹配情况拆分字符串。

|是一个正则元字符;如果你想拆分一个字面值|,你必须将它转义到\|,它作为一个Java字符串字面值是“\\|”。

Fix:

template.split("\\|")

更好的算法

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

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

是的,在数组上。返回一个固定大小的列表。

除了使用链表,只需使用addAll方法列表。

例子:

String idList = "123,222,333,444";

List<String> parentRecepeIdList = new ArrayList<String>();

parentRecepeIdList.addAll(Arrays.asList(idList.split(","))); 

parentRecepeIdList.add("555");

不能向固定大小的数组列表中删除或添加数组。

但您可以从该列表创建子列表。

List = List。subList(0, list.size() - (list.size() - count));

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 = list.subList(0, list.size() - (list.size() - count));
   }
   return StringUtils.join(list, ", ");
}

*另一种方法是

ArrayList<String> al = new ArrayList<String>(Arrays.asList(template));

这将创建数组列表,它不像Arrays.asList那样是固定大小的