Я делаю простую программу 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
Я вполне уверен, что есть очень простой способ достичь этого, но я не могу вспомнить его на данный момент!
В последней итерации цикла 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);
}
}
Нет необходимости хранить индексы элементов, которые нужно удалить. Просто удалите его прямо:
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);
}
}
Он не должен доходить до длины вашего списка. Вы должны отключить траверсы размером -1.
for (int i = 0; i<list.size() - 1; i++) {
if (list.get(i).compareTo(list.get(i+1))==0) {
positionToRemove.add(i);
}
}
Когда 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]
Когда вы получаете доступ к 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);
}
}