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

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

Ответы [ 12 ]

146 голосов
/ 10 мая 2011

Использование Collection#retainAll().

listA.retainAll(listB);
// listA now contains only the elements which are also contained in listB.

Если вы хотите избежать изменения в listA, то вам нужно создать новое.

List<Integer> common = new ArrayList<Integer>(listA);
common.retainAll(listB);
// common now contains only the elements which are contained in listA and listB.
34 голосов
/ 10 мая 2011

Вы можете использовать заданные операции пересечения с вашими ArrayList объектами.

Примерно так:

List<Integer> l1 = new ArrayList<Integer>();

l1.add(1);
l1.add(2);
l1.add(3);

List<Integer> l2= new ArrayList<Integer>();
l2.add(4);
l2.add(2);
l2.add(3);

System.out.println("l1 == "+l1);
System.out.println("l2 == "+l2);

List<Integer> l3 = new ArrayList<Integer>(l2);
l3.retainAll(l1);

    System.out.println("l3 == "+l3);
    System.out.println("l2 == "+l2);

Теперь у l3 должны быть только общие элементы между l1 иl2.

CONSOLE OUTPUT
l1 == [1, 2, 3]
l2 == [4, 2, 3]
l3 == [2, 3]
l2 == [4, 2, 3]
28 голосов
/ 06 ноября 2012

Зачем изобретать велосипед?Используйте Commons Collections :

CollectionUtils.intersection(java.util.Collection a, java.util.Collection b)
15 голосов
/ 04 августа 2015

Использование метода Java 8 * Stream.filter() в сочетании с List.contains():

import static java.util.Arrays.asList;
import static java.util.stream.Collectors.toList;

/* ... */

List<Integer> list1 = asList(1, 2, 3, 4, 5);
List<Integer> list2 = asList(1, 3, 5, 7, 9);

List<Integer> common = list1.stream().filter(list2::contains).collect(toList());
5 голосов
/ 03 октября 2018
List<Integer> listA = new ArrayList<>();
    listA.add(1);
    listA.add(5);
    listA.add(3);
    listA.add(4);   

List<Integer> listB = new ArrayList<>();
    listB.add(1);
    listB.add(5);
    listB.add(6);
    listB.add(7);
System.out.println(listA.stream().filter(listB::contains).collect(Collectors.toList()));


Java 1.8 Stream API Solutions

Выход [1, 5]

4 голосов
/ 21 мая 2018

Вы можете получить общие элементы между двумя списками, используя метод "retainAll".Этот метод удалит все несопоставленные элементы из списка, к которому он применяется.

Ex.: list.retainAll(list1);

В этом случае из списка будут удалены все элементы, отсутствующие в списке list1, и останутся только те элементы, которые являютсяобщее между списком и списком 1.

List<Integer> list = new ArrayList<>();
list.add(10);
list.add(13);
list.add(12);
list.add(11);

List<Integer> list1 = new ArrayList<>();
list1.add(10);
list1.add(113);
list1.add(112);
list1.add(111);
//before retainAll
System.out.println(list);
System.out.println(list1);
//applying retainAll on list
list.retainAll(list1);
//After retainAll
System.out.println("list::"+list);
System.out.println("list1::"+list1);

Вывод:

[10, 13, 12, 11]
[10, 113, 112, 111]
list::[10]
list1::[10, 113, 112, 111]

ПРИМЕЧАНИЕ. После применения retainAll к списку список содержит общий элемент между списком и списком 1.

4 голосов
/ 20 июля 2016

enter image description here

            List<String> lista =new ArrayList<String>();
            List<String> listb =new ArrayList<String>();

            lista.add("Isabella");
            lista.add("Angelina");
            lista.add("Pille");
            lista.add("Hazem");

            listb.add("Isabella");
            listb.add("Angelina");
            listb.add("Bianca");

            // Create an aplusb list which will contain both list (list1 and list2) in which common element will occur twice 
            List<String> listapluslistb =new ArrayList<String>(lista);    
            listapluslistb.addAll(listb);

            // Create an aunionb set which will contain both list (list1 and list2) in which common element will occur once
            Set<String> listaunionlistb =new HashSet<String>(lista);
            listaunionlistb.addAll(listb);

            for(String s:listaunionlistb)
            {
                listapluslistb.remove(s);
            }
            System.out.println(listapluslistb);
3 голосов
/ 15 ноября 2018
public <T> List<T> getIntersectOfCollections(Collection<T> first, Collection<T> second) {
        return first.stream()
                .filter(second::contains)
                .collect(Collectors.toList());
    }
2 голосов
/ 03 апреля 2016
    // Create two collections:
    LinkedList<String> listA =  new LinkedList<String>();
    ArrayList<String> listB =  new ArrayList<String>();

    // Add some elements to listA:
    listA.add("A");
    listA.add("B");
    listA.add("C");
    listA.add("D");

    // Add some elements to listB:
    listB.add("A");
    listB.add("B");
    listB.add("C");

    // use 

    List<String> common = new ArrayList<String>(listA);
    // use common.retainAll

    common.retainAll(listB);

    System.out.println("The common collection is : " + common);
1 голос
/ 09 апреля 2013

На случай, если вы захотите сделать это сами ..

List<Integer> commons = new ArrayList<Integer>();

for (Integer igr : group1) {
    if (group2.contains(igr)) {
        commons.add(igr);
    }
}

System.out.println("Common elements are :: -");
for (Integer igr : commons) {
    System.out.println(" "+igr);
}
...