Общие элементы в двух списках - PullRequest
85 голосов
/ 10 мая 2011

У меня есть два ArrayList объекта с тремя целыми числами в каждом. Я хочу найти способ вернуть общие элементы двух списков. Кто-нибудь знает, как мне этого добиться?

Ответы [ 12 ]

0 голосов
/ 12 июля 2019

рассмотрим два списка L1 и L2

Используя Java8, мы легко можем найти это

L1.stream().filter(L2::contains).collect(Collectors.toList())

0 голосов
/ 16 января 2019

Некоторые из приведенных выше ответов похожи, но не совпадают, поэтому публикуем их как новый ответ.

Решение:
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]
...