Java - 두개 리스트의 교집합, 공통 요소 찾기

두개의 리스트에서 공통된 요소만 찾을 때, 교집합을 만드는 방법을 소개합니다.

1. retainAll()으로 두 리스트의 교집합 찾기

아래와 같이 retainAll()으로 두 리스트의 교집합을 찾을 수 있습니다. retainAll()는 인자로 전달된 Collection(Set or List)의 요소들만 남기고 모두 제거합니다.

결과는 Set인데, List로 변경하고 싶다면 ArrayList를 생성하면서 Set를 인자로 전달하면 됩니다.

import java.util.*;

public class Example {

    public static void main(String[] args) {

        List<Integer> first = Arrays.asList(1, 5, 2, 4, 6, 1);
        List<Integer> second = Arrays.asList(1, 3, 5, 7);

        Set<Integer> common = new HashSet<>(first);
        common.retainAll(second);
        System.out.println(common);

        // Set to List
        List<Integer> commonList = new ArrayList<>(common);
        System.out.println(commonList);
    }
}

Output:

[1, 5]
[1, 5]

2. Stream과 filter()로 두 리스트의 교집합 찾기

아래와 같이 Stream과 filter()로 두 리스트의 교집합을 찾을 수 있습니다. filter()에서 contains()로 second 리스트가 갖고 있는 요소만 Set에 추가합니다.

import java.util.*;
import java.util.stream.Collectors;

public class Example1 {

    public static void main(String[] args) {

        List<Integer> first = Arrays.asList(1, 5, 2, 4, 6, 1);
        List<Integer> second = Arrays.asList(1, 3, 5, 7);

        Set<Integer> common = first.stream().filter(second::contains).collect(Collectors.toSet());
        System.out.println(common);

        // Set to List
        List<Integer> commonList = new ArrayList<>(common);
        System.out.println(commonList);
    }
}

Output:

[1, 5]
[1, 5]
Loading script...
codechachaCopyright ©2019 codechacha