我有这个代码:
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
从 API:
Arrays.asList:返回由指定数组支持的 固定大小的列表。
你不能add这样做;你不能remove从它。您不能在结构上修改List.
add
remove
List
创建一个LinkedList,它支持更快remove。
LinkedList
List<String> list = new LinkedList<String>(Arrays.asList(split));
split
String.split(String regex): 围绕给定正则表达式的匹配拆分此字符串。
String.split(String regex)
|是一个正则表达式元字符;如果要拆分文字|,则必须将其转义为\|,作为 Java 字符串文字"\\|"。
|
\|
"\\|"
template.split("\\|")
与其使用随机索引一次调用remove一个,不如在该范围内生成足够多的随机数,然后List用 a 遍历一次,在适当的索引处listIterator()调用。remove()关于如何在给定范围内生成随机但不同的数字,stackoverflow 存在一些问题。
listIterator()
remove()
有了这个,你的算法将是O(N).
O(N)