HiveBrain v1.2.0
Get Started
← Back to all entries
debugjavaCritical

Why do I get an UnsupportedOperationException when trying to remove an element from a List?

Submitted by: @import:stackoverflow-api··
0
Viewed 0 times
fromwhyremoveelementlistwhenunsupportedoperationexceptiongettrying

Problem

I have this code:

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 Arrays.asList returning a fixed-size list

From 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 regex

From 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.