您的位置:

Java实现两个集合取交集

一、什么是集合交集

集合交集指的是,对于两个集合A和B,找出在A和B中均存在的元素,所组成的新集合。这个概念在算法设计、数据处理等方面都非常重要。

二、使用内置方法实现集合交集

Java内置了一个方法Collections.retainAll(),可以方便地计算两个集合的交集。

    Set<Integer> set1 = new HashSet<>();
    set1.add(1);
    set1.add(2);
    set1.add(3);
    set1.add(4);
    Set<Integer> set2 = new HashSet<>();
    set2.add(3);
    set2.add(4);
    set2.add(5);
    Set<Integer> intersection = new HashSet<>(set1);
    intersection.retainAll(set2);
    System.out.println(intersection); // 输出 [3, 4]

三、实现自定义的集合交集算法

除了使用内置方法,也可以实现自定义的集合交集算法。

最简单的方法是使用两个for循环。对于第一个集合的每个元素,都遍历第二个集合,看是否存在相同元素。如果存在,则把这个元素加入交集。

    Set<Integer> set1 = new HashSet<>();
    set1.add(1);
    set1.add(2);
    set1.add(3);
    set1.add(4);
    Set<Integer> set2 = new HashSet<>();
    set2.add(3);
    set2.add(4);
    set2.add(5);
    Set<Integer> intersection = new HashSet<>();
    for (Integer elem1 : set1) {
        for (Integer elem2 : set2) {
            if (elem1.equals(elem2)) {
                intersection.add(elem1);
                break;
            }
        }
    }
    System.out.println(intersection); // 输出 [3, 4]

以上代码的时间复杂度是O(n^2)。如果集合较大,性能会比较差。

另一种实现方式是使用Java 8 Stream API。首先把两个集合转换成Stream,然后使用filter()方法筛选出交集元素,最后把结果转换成集合。

    Set<Integer> set1 = new HashSet<>();
    set1.add(1);
    set1.add(2);
    set1.add(3);
    set1.add(4);
    Set<Integer> set2 = new HashSet<>();
    set2.add(3);
    set2.add(4);
    set2.add(5);
    Set<Integer> intersection = set1.stream()
            .filter(set2::contains)
            .collect(Collectors.toSet());
    System.out.println(intersection); // 输出 [3, 4]

这个实现方式的时间复杂度是O(n)。使用Stream API的好处是代码简洁、易于阅读、易于维护,而且执行效率还比普通的for循环高。

四、总结

本文介绍了Java实现两个集合取交集的多种方式,包括使用内置方法和自定义算法。其中,Stream API的实现方式比较优美和高效,也是值得推荐的做法。