Почему я получаю исключение UnsupportedOperationException при попытке удалить элемент из списка? - PullRequest
418 голосов
/ 03 июня 2010

У меня есть этот код:

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

Ответы [ 15 ]

1 голос
/ 16 ноября 2018

Заменить

List<String> list=Arrays.asList(split);

до

List<String> list = New ArrayList<>();
list.addAll(Arrays.asList(split));

или

List<String> list = new ArrayList<>(Arrays.asList(split));

или

List<String> list = new ArrayList<String>(Arrays.asList(split));

или (лучше для удаления элементов)

List<String> list = new LinkedList<>(Arrays.asList(split));
1 голос
/ 15 апреля 2016

Ниже приведен фрагмент кода из массивов

public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

    /**
     * @serial include
     */
    private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;

так что происходит, когда метод asList вызывается, он возвращает список своей собственной версии частного статического класса, который не переопределяет функцию добавления из AbstractList для хранения элемента в массиве. Поэтому по умолчанию метод add в абстрактном списке генерирует исключение.

Так что это не обычный список массивов.

1 голос
/ 04 июля 2013

Вы не можете удалить и не можете добавить в список массивов фиксированный размер.

Но вы можете создать свой подсписок из этого списка.

list = list.subList(0, list.size() - (list.size() - count));

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 = list.subList(0, list.size() - (list.size() - count));
   }
   return StringUtils.join(list, ", ");
}

* Другой способ -

ArrayList<String> al = new ArrayList<String>(Arrays.asList(template));

это создаст ArrayList не фиксированного размера, как Arrays.asList

0 голосов
/ 21 июня 2019

Arraylist narraylist = Arrays.asList (); // Возвращает неизменный массив Чтобы сделать это изменчивым решением было бы: Arraylist narraylist = новый ArrayList (Arrays.asList ());

0 голосов
/ 24 мая 2019

Arrays.asList() использует массив фиксированного размера внутри.
Вы не можете динамически добавлять или удалять из этого Arrays.asList()

Используйте это

Arraylist<String> narraylist=new ArrayList(Arrays.asList());

В narraylist вы можете легко добавлять или удалять элементы.

...