Как я могу удалить элементы из списка

#java #collections

#java #Коллекции

Вопрос:

У меня есть 2 списка:

сначала: {1, 2, 3, 4, 5},
второй: {2, 4}

Как я могу удалить элементы из первого списка, которые содержатся во втором? В результате у меня должен быть третий список {1, 3, 5}

Комментарии:

1. Добро пожаловать. Переполнение стека не предназначено для того, чтобы просто давать вам ответы. Ожидается, что вы приложите усилия, а затем зададите вопрос о конкретной ошибке.

Ответ №1:

Упрощенная версия

 List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
List<Integer> list2 = new ArrayList<>();
list2.add(2);
list2.add(4);

list.removeAll(list2);
System.out.println("list = "   list);
 

Сложная версия

 List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
List<Integer> list2 = new ArrayList<>();
list2.add(2);
list2.add(4);

for(Integer i: list2){
    if (list.contains(i)){
        int indexOfi = list.indexOf(i);
        list.remove(indexOfi);
    }
}

System.out.println("list = "   list);
 

Ограничение этого подхода заключается в том, что он способен удалять только первое появление list2 элемента в list .

например: список: [1,2,2,3,4,5], список 2: [2,4]. результатом будет [1,2,3,5] .

Чтобы удалить дубликат, вы можете изменить if (list.contains(i)) на while (list.contains(i)) .

Комментарии:

1. Добро пожаловать в Stack Overflow!

2. Альтернативой удалению всех копий является переход removeAll(list2) на removeIf(list2::contains)

3. @sprinter или for(Integer i: list2) do {} while(list.remove(i)); который все еще проще, чем (излишне) сложная версия ответа. Но поскольку removeAll он удаляет все вхождения, я все равно не вижу смысла искать альтернативы.

4. list.remove(i) означает удаление значения в индексе i , а не удаление значения i . Так for(Integer i: list2) do {} while(list.remove(i)); не будет работать.

5. @jayzhou не путайте remove(int) с remove(Object) . Неудачно иметь одно и то же имя для обоих методов. Но поскольку в моем коде i используется тип Integer , а не int , remove(Object) будет использоваться метод, и компилятор сообщит нам, когда мы вызвали неправильный метод, поскольку remove(Object) возвращает только boolean и может использоваться с. while