#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