我有这样的代码:
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
你的代码有很多问题:
在数组。返回一个固定大小的列表
来自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)
问题是您正在使用数组. aslist()方法创建一个具有固定长度的列表
这意味着
由于返回的List是一个固定大小的List,所以不能添加/删除元素。
请看下面我正在使用的代码块
由于它是由asList()创建的迭代列表,因此不可能删除和添加,它是一个固定数组
List<String> words = Arrays.asList("pen", "pencil", "sky", "blue", "sky", "dog");
for (String word : words) {
if ("sky".equals(word)) {
words.remove(word);
}
}
这将很好地工作,因为我们正在获取一个新的数组列表,我们可以在迭代时进行修改
List<String> words1 = new ArrayList<String>(Arrays.asList("pen", "pencil", "sky", "blue", "sky", "dog"));
for (String word : words) {
if ("sky".equals(word)) {
words.remove(word);
}
}