[java] 두 목록의 공통 요소

ArrayList각각 세 개의 정수를 가진 두 개의 개체가 있습니다. 두 목록의 공통 요소를 반환하는 방법을 찾고 싶습니다. 아무도 내가 이것을 어떻게 얻을 수 있는지 아이디어가 있습니까?



답변

사용 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.


답변

교차로 설정 작업을 사용할 수 있습니다. 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);

이제 와 l3사이에 공통 요소 만 있어야합니다 .l1l2

CONSOLE OUTPUT
l1 == [1, 2, 3]
l2 == [4, 2, 3]
l3 == [2, 3]


답변

바퀴를 재발 명하는 이유는 무엇입니까? Commons 컬렉션 사용 :

CollectionUtils.intersection(java.util.Collection a, java.util.Collection b)


답변

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());


답변

여기에 이미지 설명 입력

            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);


답변

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]


답변

“retainAll”메소드를 사용하여 두 목록 사이의 공통 요소를 가져올 수 있습니다. 이 메서드는 적용되는 목록에서 일치하지 않는 모든 요소를 ​​제거합니다.

Ex.: list.retainAll(list1);

이 경우 목록에서 list1에없는 모든 요소가 제거되고 list와 list1간에 공통적 인 요소 만 남게됩니다.

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]

참고 : 목록에 preserveAll이 적용된 후 목록에는 list와 list1 사이의 공통 요소가 포함됩니다.