Java lang unsupportedoperationexception at java util abstractlist remove

Почему я получаю UnsupportedOperationException при попытке удалить элемент из списка?

Arrays.asList : возвращает список фиксированного размера, поддерживаемый указанным массивом.

Вы не можете add к нему; вы не можете remove от него. Вы не можете структурно изменить List .

Fix

Создайте LinkedList , который поддерживает более быстрый remove .

List list = new LinkedList(Arrays.asList(split)); 

Вкл split с использованием регулярного выражения

| является метасимволом регулярного выражения; если вы хотите разбить на литерал | , вы должны сбежать от него до \| , который в качестве строкового литерала Java будет «\\|» .

Fix:

О лучшем алгоритме

Вместо того чтобы называть remove по одному со случайными индексами, лучше создать достаточное количество случайных чисел в диапазоне, а затем обходить List один раз с помощью listIterator() , вызывая remove() с соответствующими индексами. Есть вопросы о stackoverflow о том, как создавать случайные, но разные числа в заданном диапазоне.

При этом ваш алгоритм будет O(N) .

Ответ 2

Это сожгло меня много раз. Arrays.asList создает немодифицируемый список. Из Javadoc: возвращает список фиксированного размера, поддерживаемый указанным массивом.

Создайте новый список с тем же контентом:

newList.addAll(Arrays.asList(newArray)); 

Это создаст немного лишнего мусора, но вы сможете его мутировать.

Ответ 3

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

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

Ответ 4

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

Ответ 5

Список, возвращаемый Arrays.asList() , может быть неизменным. Не могли бы вы попробовать

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

Ответ 6

Просто прочитайте JavaDoc для метода asList:

Возвращает список объектов в указанном массиве. Размер не может быть изменен, то есть добавление и удаление неподдерживаемые, но элементы могут быть задавать. Установка элемента изменяет базовый массив.

Это из Java 6, но похоже, что он одинаковый для java версии android.

Тип результирующего списка Arrays.ArrayList , который является частным классом внутри Arrays.class. Фактически, это не что иное, как представление List на массив, который вы передали с помощью Arrays.asList . В результате: если вы измените массив, список тоже изменится. И поскольку массив не изменяется по размеру, удаление и добавление операции должно быть неподдерживаемым.

Ответ 7

Arrays.asList() возвращает список, который не позволяет выполнять операции, влияющие на его размер (обратите внимание, что это не то же самое, что «немодифицируемое» ).

Читайте также:  Php function with null parameters

Вы можете сделать new ArrayList(Arrays.asList(split)); , чтобы создать реальную копию, но, видя то, что вы пытаетесь сделать, вот дополнительное предложение (у вас есть алгоритм O(n^2) , который находится ниже).

Вы хотите удалить list.size() — count (позволяет вызывать это k ) случайные элементы из списка. Просто выберите столько случайных элементов и поменяйте их до конца k позиций списка, затем удалите весь диапазон (например, используя subList() и clear() на этом). Это превратило бы его в скудный и средний O(n) алгоритм ( O(k) точнее).

Обновление. Как отмечено ниже, этот алгоритм имеет смысл только в том случае, если элементы неупорядочены, например. если Список представляет собой Сумку. Если, с другой стороны, Список имеет значимый порядок, этот алгоритм не сохранит его (вместо этого алгоритм полигенных смазок).

Обновление 2. Таким образом, в ретроспективе лучший (линейный, поддерживающий порядок, но с O (n) случайным числом) алгоритм будет примерно таким:

LinkedList elements = . ; //to avoid the slow ArrayList.remove() int k = elements.size() - count; //elements to select/delete int remaining = elements.size(); //elements remaining to be iterated for (Iterator i = elements.iterator(); k > 0 && i.hasNext(); remaining--) < i.next(); if (random.nextInt(remaining) < k) < //or (random.nextDouble() < (double)k/remaining) i.remove(); k--; >> 

Ответ 8

У меня есть другое решение для этой проблемы:

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

Ответ 9

Это UnsupportedOperationException возникает, когда вы пытаетесь выполнить некоторую операцию в коллекции, где ее не разрешено и в вашем случае. Когда вы вызываете Arrays.asList , он не возвращает java.util.ArrayList . Он возвращает java.util.Arrays$ArrayList , который является неизменным. Вы не можете добавить к нему, и вы не можете удалить его.

Ответ 10

Да, на Arrays.asList , возвращая список фиксированного размера.

Кроме использования связанного списка, просто используйте список методов addAll .

String idList = "123,222,333,444"; List parentRecepeIdList = new ArrayList(); parentRecepeIdList.addAll(Arrays.asList(idList.split(","))); parentRecepeIdList.add("555"); 

Ответ 11

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

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

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

public static String SelectRandomFromTemplate(String template, int count) < String[] split = template.split("\\|"); Listlist = 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 al = new ArrayList(Arrays.asList(template)); 

это создаст ArrayList, который не является фиксированным размером, например Arrays.asList

Ответ 12

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

public static List asList(T. a) < return new ArrayList<>(a); > /** * @serial include */ private static class ArrayList extends AbstractList implements RandomAccess, java.io.Serializable < private static final long serialVersionUID = -2764017481108945198L; private final E[] a; 

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

Читайте также:  Set background color using jQuery - css() method

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

Ответ 13

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

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

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

Ответ 14

Arraylist narraylist = Arrays.asList(); // Возвращает неизменяемый arraylist Чтобы сделать его изменяемым, было бы следующее: Arraylist narraylist = new ArrayList (Arrays.asList());

Ответ 15

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

Arraylist narraylist=new ArrayList(Arrays.asList()); 

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

Ответ 16

Создание нового списка и заполнение допустимых значений в новом списке работало для меня.

List list = new ArrayList<>(); for (String s: list) < if(s is null or blank) < list.remove(s); >> desiredObject.setValue(list); 
 List list = new ArrayList<>(); List newList= new ArrayList<>(); for (String s: list) < if(s is null or blank) < continue; >newList.add(s); > desiredObject.setValue(newList); 

Источник

Overview

In this article, we’ll cover one of the nuances in the Java Collections Framework when creating ArrayList objects.

I ran into this runtime exception recently while attempting to remove an element from an ArrayList in Java, and it puzzled me for a few minutes.

Below is some sample code that demonstrates the issue.

Code

import java.util.Arrays; import java.util.List; public class Main < public static void main(String[] args) throws Exception < Listnames = getNames(); names.remove(0); > private static List getNames() < return Arrays.asList("Amir", "Arnie", "Beth", "Lucy"); >>

Output

Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.remove(AbstractList.java:161) at Main.main(Main.java:8)

The getNames() method returns an ArrayList so why is the remove() operation throwing an exception?

The static method called on line 12 Arrays.asList returns an instance of java.util.Arrays$ArrayList which is a nested class inside the Arrays class that implements the List interface. This particular implementation has a fixed size.

This is actually different than what I expected it to return which was the standard java.util.ArrayList .

The solution is to use the constructor to create the list:

private static List getNames() < return new ArrayList<>(Arrays.asList("Amir", "Arnie", "Beth", "Lucy")); >

Источник

How to Fix the Unsupported Operation Exception in Java

How to Fix the Unsupported Operation Exception in Java

An UnsupportedOperationException is a runtime exception in Java that occurs when a requested operation is not supported. For example, if an unmodifiable List is attempted to be modified by adding or removing elements, an UnsupportedOperationException is thrown. This is one of the common exceptions that occur when working with Java collections such as List, Queue, Set and Map.

Читайте также:  Reading pdf in python

The UnsupportedOperationException is a member of the Java Collections Framework. Since it is an unchecked exception, it does not need to be declared in the throws clause of a method or constructor.

What Causes UnsupportedOperationException

An UnsupportedOperationException is thrown when a requested operation cannot be performed because it is not supported for that particular class. One of the most common causes for this exception is using the asList() method of the java.util.Arrays class. Since this method returns a fixed-size unmodifiable List , the add() or remove() methods are unsupported. Trying to add or remove elements from such a List will throw the UnsupportedOperationException exception.

Other cases where this exception can occur include:

  • Using wrappers between collections and primitive types.
  • Trying to remove elements using an Iterator .
  • Trying to add, remove or set elements using ListIterator .

UnsupportedOperationException Example

Here’s an example of an UnsupportedOperationException thrown when an object is attempted to be added to an unmodifiable List :

import java.util.Arrays; import java.util.List; public class UnsupportedOperationExceptionExample < public static void main(String[] args) < String array[] = ; List list = Arrays.asList(array); list.add("d"); > >

Since the Arrays.asList() method returns a fixed-size list, attempting to modify it either by adding or removing elements throws an UnsupportedOperationException .

Running the above code throws the exception:

Exception in thread "main" java.lang.UnsupportedOperationException at java.base/java.util.AbstractList.add(AbstractList.java:153) at java.base/java.util.AbstractList.add(AbstractList.java:111) at UnsupportedOperationExceptionExample.main(UnsupportedOperationExceptionExample.java:8)

How to Resolve UnsupportedOperationException

The UnsupportedOperationException can be resolved by using a mutable collection, such as ArrayList , which can be modified. An unmodifiable collection or data structure should not be attempted to be modified.

The unmodifiable List returned by the Arrays.asList() method in the earlier example can be passed to a new ArrayList object, which can be modified:

import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class UnsupportedOperationExceptionExample < public static void main(String[] args) < String array[] = ; List list = Arrays.asList(array); List arraylist = new ArrayList<>(list); arraylist.add("d"); System.out.println(arraylist); > >

Here, a new ArrayList object is created using the unmodifiable list returned from the Arrays.asList() method. When a new element is added to the ArrayList , it works as expected and resolves the UnsupportedOperationException. Running the above code produces the following output:

Track, Analyze and Manage Errors With Rollbar

Rollbar in action

Managing errors and exceptions in your code is challenging. It can make deploying production code an unnerving experience. Being able to track, analyze, and manage errors in real-time can help you to proceed with more confidence. Rollbar automates error monitoring and triaging, making fixing Java errors easier than ever. Sign Up Today!

Источник

Оцените статью