Удаление смежных дубликатов в ArrayList [Java]

1

Я делаю простую программу Java, и мне нужно удалить все смежные дубликаты в String ArrayList.

Мой String ArrayList выглядит примерно так:

list = [a,b,c,c,d,a,b,c,d]

Моя цель - удалить все (и только!) Смежные дубликаты, чтобы результат был: [a, b, c, d, a, b, c, d]. Как вы можете видеть, один из двух смежных "c" удален.

Я попробовал что-то вроде этого:

for (int i = 0; i<list.size(); i++) {

        if (list.get(i).compareTo(list.get(i+1))==0) {
            positionToRemove.add(i);
        }

    }

Когда positionToRemove в конце будет содержать все позиции смежных элементов, которые я удалю с помощью list.remove() (все еще не выполнен)

К сожалению, я получаю

java.lang.IndexOutOfBoundsException

Я вполне уверен, что есть очень простой способ достичь этого, но я не могу вспомнить его на данный момент!

Теги:
arraylist

5 ответов

0
Лучший ответ

В последней итерации цикла for list.get(i+1) выходит за пределы списка и, следовательно, IndexOutOfBoundsException. В любом массиве /arraylist максимальный доступный индекс всегда имеет size/length - 1.

Чтобы исправить это, вам нужно немного изменить свою логику.

for (int i = 1; i<list.size(); i++) {
    if (list.get(i-1).compareTo(list.get(i))==0) {
        positionToRemove.add(i);
    }
}
  • 1
    У меня всегда были проблемы с исключениями границ, но это оказалось очень полезным для понимания работы циклов. Большое спасибо!
1

Нет необходимости хранить индексы элементов, которые нужно удалить. Просто удалите его прямо:

int size = list.size();
for (int i = size - 1; i >= 1; i--) {
    if (list.get(i).compareTo(list.get(i - 1)) == 0) {
        list.remove(i);
    }
}
0

Он не должен доходить до длины вашего списка. Вы должны отключить траверсы размером -1.

for (int i = 0; i<list.size() - 1; i++) {
    if (list.get(i).compareTo(list.get(i+1))==0) {
        positionToRemove.add(i);
    }
}
0

Когда positionToRemove в конце будет содержать все позиции смежных элементов, которые я удалю с помощью list.remove() (все еще не выполнен)

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

List<String> list = new ArrayList<>(Arrays.asList("a","b","c","c","d","a","b","c","d"));
for(int i = list.size() - 1; i > 0; i--){
    if(list.get(i).compareTo(list.get(i-1)) == 0){
        list.remove(i);
    }
}
System.out.println(list);

Какие результаты:

[a, b, c, d, a, b, c, d]
0

Когда вы получаете доступ к List с использованием индекса + 1 или i+1, вы переступаете границы List на последней итерации. Вы можете исправить это, установив условие для цикла for в i < list.size() -1.

for (int i = 0; i < list.size() -1; i++) {  
        if (list.get(i).compareTo(list.get(i+1))==0) {
            positionToRemove.add(i);
        }
 }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню