Почему list1.removeAll(list2) удаляет все дублирующиеся элементы, а не количество вхождений в list2

Я создал два ArrayList из Integer. List1 содержит [1, 2, 2, 2, 5], а List2 содержит [2]. Я попытался List1.removeAll(List2) должен удалить 2 из List1 только один раз вместо того, чтобы удалить все вхождения 2 из List1. Также List1.remove(List2) не работает вообще.

public static void main(String[] args) {
        ArrayList<Integer> list1 = new ArrayList<>();
        list1.add(2);
        list1.add(5);
        list1.add(1);
        list1.add(2);
        list1.add(2);
        Collections.sort(list1);
        System.out.println(list1);
        ArrayList<Integer> list2 = new ArrayList<>();
        list2.add(2);
        list1.removeAll(list2);
        System.out.println(list1);
}

Expected OUTPUT - [1, 2, 2, 2, 5]
                  [1, 2, 2, 5]

Actual OUTPUT - [1, 2, 2, 2, 5]
                [1, 5]

2 ответа

Я пытался List1.removeAll(List2) должен удалить 2 из List1 только один раз вместо того, чтобы удалить все вхождения 2 из List1

Нет. List1.removeAll(List2) удаляет все вхождения List2 (из List1), потому что это то, что задокументировано сделать:

логическое удалить All (коллекция c)

Удаляет из этого списка все его элементы, которые содержатся в указанной коллекции (необязательная операция).

Если вы хотите удалить только первый элемент, вы должны использовать List.remove (object). Ниже приводится ссылка из документа:

логическое удаление (объект o)

Удаляет первое вхождение указанного элемента из этого списка, если он присутствует (необязательная операция). Если этот список не содержит элемент, он не изменяется.

Тебе нужно List.remove(Object) если вы хотите удалить первое совпадение (как отмечено в связанном Javadoc). List.removeAll(Collection<?>) удаляет все спички Вы также можете использовать IntStream построить свой List и использовать List (вместо конкретного ArrayList реализация). Подобно,

List<Integer> list1 = IntStream.of(2, 5, 1, 2, 2).boxed().collect(Collectors.toList());
Collections.sort(list1);
System.out.println(list1);
List<Integer> list2 = IntStream.of(2).boxed().collect(Collectors.toList());
for (Integer v : list2) {
    list1.remove(v);
}
System.out.println(list1);

Какие выводы

[1, 2, 2, 2, 5]
[1, 2, 2, 5]
Другие вопросы по тегам