При удалении элементов из списка мне всегда проще всего обрабатывать список в обратном направлении, от конца к началу. Таким образом, единственные индексы, которые сдвигаются при удалении элементов, - это те, с которыми я уже закончил, поэтому я могу игнорировать сдвиг.
public static void processArray(ArrayList<Integer> array) {
// process from end of list backward
int ix = array.size();
while (ix > 0) {
if (array.get(ix - 1) % 10 == 6) {
// find beginning of run of numbers that end in 6
int beginIx = ix - 1;
while (beginIx > 0 && array.get(beginIx - 1) % 10 == 6) {
beginIx--;
}
List<Integer> runOf6 = array.subList(beginIx, ix);
if (runOf6.size() >= 2) {
// delete entire run
runOf6.clear();
}
ix = beginIx;
}
else {
ix--;
}
}
}
Демо-версия:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(3, 6, 36, 62, 121, 66, 26, 376, 661, 6));
processArray(list);
System.out.println(list);
Выход:
[3, 62, 121, 661, 6]
Редактировать: Другой вариант - пойти противоположным путем: создать список результатов, добавив в исходный список те элементы, которые не являются частью серии из по меньшей мере двух чисел, заканчивающихся на 6. Как. в особом случае, если исходный список имеет длину 0 или 1, возвращает его как есть, поскольку в нем просто не может быть двух чисел, заканчивающихся на 6. В противном случае создайте список результатов. Итерация вперед по исходному списку. Для каждого элемента, если он заканчивается на 6, а также имеет соседа (по крайней мере) на одной стороне, которая заканчивается на 6, пропустите его; иначе добавьте это к результату. Старайтесь не проверять левого соседа первого элемента или правого соседа последнего, поскольку их не существует, и вы получите IndexOutOfBoundsException
. Я предоставляю вам возможность изучить этот вариант, если хотите.