Я пытаюсь удалить дубликаты из 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);
}
}
}
Во-первых, я не могу создать новый список и изменить его, потому что я ничего не должен возвращать. Я должен изменить список на месте.
Могу поспорить, тогда вы используете не ArrayList, а либо Arrays.asList(...), либо любой другой неизменяемый список.
Конечно, даже если вы использовали изменяемый список, тогда вы получите ConcurrentModificationException при вызове list.remove в этом цикле.
Список, созданный Arrays.asList( int[] ), не может быть передан removeDuplicates.
Кроме того, не используйте == вместо Integer, используйте equals().
@RoddyoftheFrozenPeas Нет, исключения ConcurrentModificationException не будет.
Да, это Array.asList(int[]). Как я могу справиться с этим?
Нет, не может быть Array.asList(int[ ]), это что-то другое, типа Array.asList(1,2,3). Использование массива int вызовет разные проблемы.
Его List<Integer> list1 = Arrays.asList(1,2,3,4,4,3,2,1); это передается
Ваш вопрос дублирует remove() в списке, созданном Arrays.asList(), выдает UnsupportedOperationException
Я не могу создать новый, потому что мне нужно изменить значение в данном списке. Я не должен ничего возвращать.
Ну, вам придется изменить свой дизайн. Вы принципиально не можем удаляете элемент из массива. Спецификация языка Java и спецификация JVM не позволяют этого. (И если вы не можете изменить дизайн или найти способ альтернатива, не связанный с изменением длины массива, вам нужно подумать о полном отказе от проекта. Это немного похоже на высказывание: «Мне нужно изменить математику, поэтому что 1 + 1 равно 3 для моего проекта". Это не сработает.)
Это означает, что мой профессор не прав. Он хочет, чтобы я удалил его. Но я не могу понять, как.
Я думаю, что более вероятно, что вы не понял того, что ваш профессор В самом деле говорит и/или просит вас сделать. Иди поговори с ним... и будь готов "съесть скромный пирог".




Вы не можете удалять элементы, перебирая их с помощью цикла for. Простой способ обойти это - создать новый ArrayList, содержащий ваши исходные элементы списков, а затем зациклиться на исходном списке, удалив дубликаты из вашей копии списка, а затем вернуть его.
Даже если бы вы могли удалить элементы с помощью цикла for, другое дело, если бы список типа UnmodifiableCollection? Если это так, вы не можете удалить из него элементы, что является точкой класса. Опять же, решением было бы создать новый ArrayList, который копирует исходные элементы, удаляет и изменяет их, как вам нравится, и возвращает их вызывающему коду.
На самом деле, в некоторых случаях вы можете удалять элементы при переборе списка. Если вы индексируете список, все в порядке. И если вы выполняете итерацию с помощью итератора (явно), вы можете использовать Iterator::remove. ОП мог работать с было бы при условии, что это список, поддерживающий удаление... и он исправил ошибки в индексации; например get(i+1) когда i == list.length() - 1.
Я согласен с удалением () Итератора. Можете ли вы объяснить, что вы подразумеваете под «если вы индексируете список»
Использование цикла для перебора индексов массива и get(index), set(index), remove(index) и так далее. В основном, что делает пример ОП!
Скорее всего, ваш список представляет собой неизменяемый список, например, созданный
Arrays.asList( int[] ).