debugjavaCritical
Why do I get an UnsupportedOperationException when trying to remove an element from a List?
Viewed 0 times
fromwhyremoveelementlistwhenunsupportedoperationexceptiongettrying
Problem
I have this code:
I get this:
How would be this the correct way? Java.15
public static String SelectRandomFromTemplate(String template,int count) {
String[] split = template.split("|");
List 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
Solution
Quite a few problems with your code:
On
From the API:
You can't
Fix
Create a
On
From the API:
Fix:
On better algorithm
Instead of calling
With this, your algorithm would be
On
Arrays.asList returning a fixed-size listFrom the API:
Arrays.asList: Returns a fixed-size list backed by the specified array.You can't
add to it; you can't remove from it. You can't structurally modify the List.Fix
Create a
LinkedList, which supports faster remove.List list = new LinkedList(Arrays.asList(split));On
split taking regexFrom the API:
String.split(String regex): Splits this string around matches of the given regular expression.| 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:
template.split("\\|")On better algorithm
Instead of calling
remove one at a time with random indices, it's better to generate enough random numbers in the range, and then traversing the List once with a listIterator(), calling remove() 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).Code Snippets
List<String> list = new LinkedList<String>(Arrays.asList(split));template.split("\\|")Context
Stack Overflow Q#2965747, score: 1237
Revisions (0)
No revisions yet.