UnsupportedOperationException при удалении

Я пытаюсь удалить дубликаты из ArrayList. Но я продолжаю получать это исключение UnsupportedOperationException

public static void removeDuplicates(List<Integer> list) {
    Collections.sort(list);

    for(int i = 0; i<list.size();i++) {
        if (list.get(i)== list.get((i+1))) {
            list.remove(i+1);
        }

    }

} 

Во-первых, я не могу создать новый список и изменить его, потому что я ничего не должен возвращать. Я должен изменить список на месте.

Скорее всего, ваш список представляет собой неизменяемый список, например, созданный Arrays.asList( int[] ).

Roddy of the Frozen Peas 08.03.2019 01:01

Могу поспорить, тогда вы используете не ArrayList, а либо Arrays.asList(...), либо любой другой неизменяемый список.

Tom 08.03.2019 01:01

Конечно, даже если вы использовали изменяемый список, тогда вы получите ConcurrentModificationException при вызове list.remove в этом цикле.

Roddy of the Frozen Peas 08.03.2019 01:02

Список, созданный Arrays.asList( int[] ), не может быть передан removeDuplicates.

Tom 08.03.2019 01:02

Кроме того, не используйте == вместо Integer, используйте equals().

RaminS 08.03.2019 01:03

@RoddyoftheFrozenPeas Нет, исключения ConcurrentModificationException не будет.

Tom 08.03.2019 01:03

Да, это Array.asList(int[]). Как я могу справиться с этим?

Yojan Gautam 08.03.2019 01:11

Нет, не может быть Array.asList(int[ ]), это что-то другое, типа Array.asList(1,2,3). Использование массива int вызовет разные проблемы.

Tom 08.03.2019 01:17

Его List<Integer> list1 = Arrays.asList(1,2,3,4,4,3,2,1); это передается

Yojan Gautam 08.03.2019 01:19

Я не могу создать новый, потому что мне нужно изменить значение в данном списке. Я не должен ничего возвращать.

Yojan Gautam 08.03.2019 01:23

Ну, вам придется изменить свой дизайн. Вы принципиально не можем удаляете элемент из массива. Спецификация языка Java и спецификация JVM не позволяют этого. (И если вы не можете изменить дизайн или найти способ альтернатива, не связанный с изменением длины массива, вам нужно подумать о полном отказе от проекта. Это немного похоже на высказывание: «Мне нужно изменить математику, поэтому что 1 + 1 равно 3 для моего проекта". Это не сработает.)

Stephen C 08.03.2019 01:26

Это означает, что мой профессор не прав. Он хочет, чтобы я удалил его. Но я не могу понять, как.

Yojan Gautam 08.03.2019 01:30

Я думаю, что более вероятно, что вы не понял того, что ваш профессор В самом деле говорит и/или просит вас сделать. Иди поговори с ним... и будь готов "съесть скромный пирог".

Stephen C 08.03.2019 01:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
14
84
1

Ответы 1

Вы не можете удалять элементы, перебирая их с помощью цикла for. Простой способ обойти это - создать новый ArrayList, содержащий ваши исходные элементы списков, а затем зациклиться на исходном списке, удалив дубликаты из вашей копии списка, а затем вернуть его.

Даже если бы вы могли удалить элементы с помощью цикла for, другое дело, если бы список типа UnmodifiableCollection? Если это так, вы не можете удалить из него элементы, что является точкой класса. Опять же, решением было бы создать новый ArrayList, который копирует исходные элементы, удаляет и изменяет их, как вам нравится, и возвращает их вызывающему коду.

На самом деле, в некоторых случаях вы можете удалять элементы при переборе списка. Если вы индексируете список, все в порядке. И если вы выполняете итерацию с помощью итератора (явно), вы можете использовать Iterator::remove. ОП мог работать с было бы при условии, что это список, поддерживающий удаление... и он исправил ошибки в индексации; например get(i+1) когда i == list.length() - 1.

Stephen C 08.03.2019 01:13

Я согласен с удалением () Итератора. Можете ли вы объяснить, что вы подразумеваете под «если вы индексируете список»

tomgeraghty3 08.03.2019 01:15

Использование цикла для перебора индексов массива и get(index), set(index), remove(index) и так далее. В основном, что делает пример ОП!

Stephen C 08.03.2019 01:35

Другие вопросы по теме