我有以下代码:
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返回一个固定大小的列表
Arrays.asList
从API:
Arrays.asList:返回指定数组支持的固定大小的列表。
你不能add做到 你不能remove。你无法在结构上修改List。
add
remove
List
Fix
创建一个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一次遍历一次listIterator(),并remove()在适当的索引上调用,这更好。关于如何在给定范围内生成随机但不同的数字,有一些关于stackoverflow的问题。
listIterator()
remove()
stackoverflow
这样,你的算法将是O(N)。
O(N)