我有这样的代码:
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
取代
List<String> list=Arrays.asList(split);
to
List<String> list = New ArrayList<>();
list.addAll(Arrays.asList(split));
or
List<String> list = new ArrayList<>(Arrays.asList(split));
or
List<String> list = new ArrayList<String>(Arrays.asList(split));
或(更适合删除元素)
List<String> list = new LinkedList<>(Arrays.asList(split));
你的代码有很多问题:
在数组。返回一个固定大小的列表
来自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)