Некоторые из приведенных выше ответов похожи, но не совпадают, поэтому публикуем их как новый ответ.
Решение:
1. Используйте HashSet для хранения элементов, которые необходимо удалить
2.Добавьте все элементы list1 в HashSet
3. итерируйте list2 и удалите элементы из HashSet, которые присутствуют в list2 ==>, которые присутствуют как в list1, так и в list2
4. Теперь выполните итерацию по HashSet и удалите элементы из list1(поскольку мы добавили все элементы list1 для установки), наконец, list1 имеет все общие элементы
Примечание: мы можем добавить все элементы list2 и на 3-й итерации мы должны удалить элементы из list2.
Сложность времени: O (n)
Сложность пространства: O (n)
Код:
import com.sun.tools.javac.util.Assert;
import org.apache.commons.collections4.CollectionUtils;
List<Integer> list1 = new ArrayList<>();
list1.add(1);
list1.add(2);
list1.add(3);
list1.add(4);
list1.add(5);
List<Integer> list2 = new ArrayList<>();
list2.add(1);
list2.add(3);
list2.add(5);
list2.add(7);
Set<Integer> toBeRemoveFromList1 = new HashSet<>(list1);
System.out.println("list1:" + list1);
System.out.println("list2:" + list2);
for (Integer n : list2) {
if (toBeRemoveFromList1.contains(n)) {
toBeRemoveFromList1.remove(n);
}
}
System.out.println("toBeRemoveFromList1:" + toBeRemoveFromList1);
for (Integer n : toBeRemoveFromList1) {
list1.remove(n);
}
System.out.println("list1:" + list1);
System.out.println("collectionUtils:" + CollectionUtils.intersection(list1, list2));
Assert.check(CollectionUtils.intersection(list1, list2).containsAll(list1));
Выход:
list1:[1, 2, 3, 4, 5]
list2:[1, 3, 5, 7]
toBeRemoveFromList1:[2, 4]
list1:[1, 3, 5]
collectionUtils:[1, 3, 5]