Java - 2つのリストの交差、共通要素を見つける

2つのリストで共通の要素のみを見つけるときに、交差集合を作成する方法を紹介します。

1. retainAll() で 2 つのリストの交差集合を探す

以下のように retainAll() で 2 つのリストの交差集合を見つけることができます。 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() で 2 つのリストの交差集合を探す

以下のように、Streamと filter()で2つのリストの交差集合を見つけることができます。 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]
codechachaCopyright ©2019 codechacha