Удалить ArrayList из индекса i в i + 3 - PullRequest
0 голосов
/ 03 мая 2020

Извините, если этот вопрос слишком прост или был задан ранее, я новичок в программировании, у меня есть ArrayList с именем ar, объявленный как ArrayList ar = new ArrayList();

И у меня есть следующий код:

String delnr = "";
delnr = cin.nextLine();

if(ar.contains(delnr))
{
    for (int i = 0; i < ar.size(); i++)
    {
        if(ar.get(i).equals(delnr))
        {
            ar.remove(i);

            //Here I want to remove i+1 i+2 and i+3 as well.
        }
    }
}

Любая логическая попытка, которую я попробую, приведет к ошибке IndexOutOfBounds.

Мой ArrayList имеет тип [dd1, x, y, z, dd2, x, y, z, dd3, x, y, z, ...]

delnr, может быть только dd1 или dd2, и т. Д. c ..

В общем, если мой delnr равен dd2, я хочу удалить dd2 и x, y и z после этого мой новый список должен выглядеть так:

[dd1, x, y, z, dd3, x, y, z, ...]

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Вы не можете использовать removeRange. Просто сделай это так. Это работает, потому что subList является неизменным представлением исходного списка. Таким образом, изменение subList приводит к изменению исходного списка.

List<Integer> list = new ArrayList<>(List.of(1,2,3,10,20,30,40,4,5,6,7));
System.out.println(list);
list.removeAll(list.subList(3,7));
System.out.println(list);

Печать

[1, 2, 3, 10, 20, 30, 40, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 6, 7]

В вашем случае это будет что-то вроде

List<Integer> list = 
    new ArrayList<>(List.of(1, 2, 3, 10, 20, 30, 40, 4, 5, 6, 7));
for (int i = 0; i < list.size(); i++) {
    if (list.get(i) == 10) {
        list.removeAll(list.subList(i, i + 4));
    }
}
System.out.println(list);

0 голосов
/ 03 мая 2020

Самая важная вещь, которую нужно понять, когда вы удаляете элемент с помощью индекса, это то, что List сжимается каждый раз, т.е. вам просто нужно снова вызвать remove, чтобы удалить следующий элемент, потому что следующий элемент занял место последнего удаленного element.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>(Arrays.asList("c", "b", "a", "d", "e", "j", "k"));
        System.out.println("Original list: ");
        System.out.println(list);

        // Let's say we are searching `a`
        int index = list.indexOf("a");
        if (index != -1 && ((index + 3) < list.size())) {
            // Remove element at index, index + 1, index + 2 and index +3
            list.remove(index);
            list.remove(index);
            list.remove(index);
            list.remove(index);
        }

        System.out.println("Updated list: ");
        System.out.println(list);
    }
}

Вывод:

Original list: 
[c, b, a, d, e, j, k]
Updated list: 
[c, b, k]

Вы можете упростить приведенный выше код, поместив повторный код внутри al oop следующим образом:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>(Arrays.asList("c", "b", "a", "d", "e", "j", "k"));
        System.out.println("Original list: ");
        System.out.println(list);

        // Let's say we are searching `a`
        int index = list.indexOf("a");
        if (index != -1 && ((index + 3) < list.size())) {
            // Remove element at index, index + 1, index + 2 and index +3
            for (int i = 1; i <= 4; i++) {
                list.remove(index);
            }
        }

        System.out.println("Updated list: ");
        System.out.println(list);
    }
}

Вывод:

Original list: 
[c, b, a, d, e, j, k]
Updated list: 
[c, b, k]

Примечания:

  1. Когда элемент не найден List :: indexOf возвращает -1.
  2. Также важно проверить (index + 3) < list.size(), чтобы избежать IndexOutOfBoundsException. Например, скажем, a был найден по индексу 2, и после этого был только один элемент, т.е. в списке было всего 4 элементов. В этом случае попытка получить доступ ( get или удалить ) к элементу из индекса 4 или 5 выдаст IndexOutOfBoundsException.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...