I have this code:
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, ", ");
}
I get this:
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)
How would be this the correct way? Java.15
Quite a few problems with your code:
On
Arrays.asListreturning a fixed-size listFrom the API:
You can’t
addto it; you can’tremovefrom it. You can’t structurally modify theList.Fix
Create a
LinkedList, which supports fasterremove.On
splittaking regexFrom the API:
|is a regex metacharacter; if you want to split on a literal|, you must escape it to\|, which as a Java string literal is"\\|".Fix:
On better algorithm
Instead of calling
removeone at a time with random indices, it’s better to generate enough random numbers in the range, and then traversing theListonce with alistIterator(), callingremove()at appropriate indices. There are questions on stackoverflow on how to generate random but distinct numbers in a given range.With this, your algorithm would be
O(N).