Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
525 / 261 / 69
Регистрация: 11.12.2016
Сообщений: 1,223
1

List.remove() vs asList.remove()

20.12.2018, 17:46. Показов 1412. Ответов 6
Метки нет (Все метки)

Всем привет.
Хотел решить одну задачку тут на форуме, но что-то у меня все из рук валится, и в переносном смысле тоже.
Немного поэкспериментировал понял что list при remove() падает когда list = Arrays.asList(a); и в тоже время нормально работает когда List<Integer> list = new ArrayList<>(); list.add();
Прошу не решить за меня задачу а помочь разобратся. (На всякий случай : я хотел найти максимум, потом удалить его и найти второй, потом аналогично 3-й).
Вот ошибка :
Код
Exception in thread "main" java.lang.UnsupportedOperationException: remove
	at java.base/java.util.Iterator.remove(Iterator.java:102)
	at java.base/java.util.AbstractCollection.remove(AbstractCollection.java:299)
	at Arychmetics.ThreeMultiMaxNumber.find3Max(ThreeMultiMaxNumber.java:33)
	at Arychmetics.ThreeMultiMaxNumber.main(ThreeMultiMaxNumber.java:18)
код 1 : (пришлось закомментить удаление)
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    public static void main(String[] args){
        Integer[] a = {-96, 15, 20, 83, 27, -98, -23, 24, 29, 73, 16};
        System.out.println(Arrays.toString(find3Max(a)));
    }
    static int[] find3Max(Integer[] a) {
        List<Integer> list = Arrays.asList(a);
//        List<Integer> list = new ArrayList<>();
//        list.add(3);
//        list.add(4);
//        list.add(14);
//        list.add(6);
//        list.add(7);
        int[] b = new int[3];
        for(int i=0; i<3; i++) {
            b[i] = Collections.max(list);
//            list.remove(Integer.valueOf(b[i]));
        }
        System.out.println(list);
        return b;
    }
код 2 : А вот здесь все работает, remove() не выдает ошибки
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    public static void main(String[] args){
        Integer[] a = {-96, 15, 20, 83, 27, -98, -23, 24, 29, 73, 16};
        System.out.println(Arrays.toString(find3Max(a)));
    }
    static int[] find3Max(Integer[] a) {
//        List<Integer> list = Arrays.asList(a);
        List<Integer> list = new ArrayList<>();
        list.add(3);
        list.add(4);
        list.add(14);
        list.add(6);
        list.add(7);
        int[] b = new int[3];
        for(int i=0; i<3; i++) {
            b[i] = Collections.max(list);
            list.remove(Integer.valueOf(b[i]));
        }
        System.out.println(list);
        return b;
    }
Подскажите в чем суть, проблема в том как создаются списки? Неужели это настолько разные list? Как легко решить ее не теряя преимущество инициализации списка?
Спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.12.2018, 17:46
Ответы с готовыми решениями:

Почему List.remove(0) удаляет последний элемент?
есть result.addAll(orElements); где result и orElements - оба List&lt;StackElement&gt; ...

ArrayList.remove()
Есть такой код. ArrayList&lt;NewClass&gt; list = new ArrayList&lt;NewClass&gt;(); //Добавляем 10 объектов...

LinkedList время работы remove()
Задание было написать свой LinkedList и сравнить его время работы с временем стандартного...

Метод remove (двоичное дерево поиска)
Не получается реализовать метод remove Интерфейс public interface Map&lt;K extends Comparable&lt;K&gt;, V&gt;...

6
Автоматизируй это!
Эксперт Python
4205 / 2887 / 856
Регистрация: 30.03.2015
Сообщений: 9,346
Записей в блоге: 15
20.12.2018, 18:26 2
Лучший ответ Сообщение было отмечено ViktorFX как решение

Решение

ViktorFX, а ты загляни внутри, что там возвращает asList? да, он типа аррейлист возвращает, только не нам с тобой известный а другую имплементацию в Аррейс
Java
1
private static class ArrayList<E> extends AbstractList<E>
он не поддерживает удаление (там много чего кинет исключение)

можно написать вот так для использования нашего родного лампового аррейлиста

Java
1
List<Integer> list = new ArrayList<Integer>(Arrays.asList(a));
1
Супер-модератор
Эксперт PythonЭксперт Java
7569 / 4152 / 1536
Регистрация: 21.10.2017
Сообщений: 11,715
20.12.2018, 18:30 3
Когда создаешь лист таким образом
List<Integer> list = Arrays.asList(a);
, исходный массив и новый лист остаются "связанными". А если сделать с new, как написал Welemir1, то нет.
1
Автоматизируй это!
Эксперт Python
4205 / 2887 / 856
Регистрация: 30.03.2015
Сообщений: 9,346
Записей в блоге: 15
20.12.2018, 18:33 4
Цитата Сообщение от iSmokeJC Посмотреть сообщение
исходный массив и новый лист остаются "связанными".
да, важное замечание, по сути мы получаем обертку над исходным массивом
0
525 / 261 / 69
Регистрация: 11.12.2016
Сообщений: 1,223
20.12.2018, 18:35  [ТС] 5
Welemir1, Я смотрел в нормальный ArrayList а потом в remove как он работает. Мне в голову не проходило что это другая вещь.
ArrayList<>(Arrays.asList(a)); Это похоже то что надо! Спасибо
0
Автоматизируй это!
Эксперт Python
4205 / 2887 / 856
Регистрация: 30.03.2015
Сообщений: 9,346
Записей в блоге: 15
20.12.2018, 18:37 6
Цитата Сообщение от ViktorFX Посмотреть сообщение
Я смотрел в нормальный ArrayList а потом в remove как он работает.
прямо в Идее можно Ctrl нажимать и мышью кликать по названиям методов = будешь проваливаться туда, где они объявлены и сразу заметишь, что ты где то не там )
0
525 / 261 / 69
Регистрация: 11.12.2016
Сообщений: 1,223
20.12.2018, 18:47  [ТС] 7
Welemir1, У меня NetBeans(с него начал учится), но по сути разница небольшая (для непрофессионалов), тоже Ctrl тут используется.
Но доки лучше) Не надо код прокручивать, хорошая навигация по методам класса и понятная общая картина класса.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2018, 18:47

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

LinkedList: метод remove не удаляет нужное значение
В чем может быть ошибка...но не корректно работает метод .remove он не удаляет нужное значение ...

Дайте источники по реализации remove в бинарном дереве
Через ссылки я всё написал. Задача - написать удаление элемента из дерева, используя реализацию на...

Remove и Empty такого метода нет, чем его заменить ?
public static int ToArabic(string number) { if (number == string.Empty) return 0; if...

Статический метод Arrays.asList() не возвращает контейнер, реализующий интерфейс List, при двух одинаковых аргументах:
import java.util.*; class Snow {} class Powder extends Snow {} class Crusty extends Snow {}...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.