Java筛选两个集合重复的元素

在Java开发中,我们经常会遇到需要对两个集合进行筛选,找出其中重复的元素的情况。本文将介绍如何使用Java来筛选两个集合中的重复元素,并提供相应的代码示例。

1. 问题背景

假设我们有两个集合A和B,它们包含了一些元素。我们希望找出这两个集合中重复的元素。例如,集合A包含元素[1, 2, 3, 4, 5],集合B包含元素[4, 5, 6, 7, 8],那么我们希望找到的重复元素为[4, 5]。

2. 解决方法

为了解决这个问题,我们可以使用以下两种方法进行筛选:

2.1 方法一:使用循环遍历

我们可以使用两个嵌套的循环来遍历集合A和集合B,对比它们的每一个元素。如果发现有相同的元素,就将其添加到一个新的集合中。代码示例如下:

List<Integer> findDuplicates(List<Integer> listA, List<Integer> listB) {
    List<Integer> duplicates = new ArrayList<>();
    
    for (Integer elementA : listA) {
        for (Integer elementB : listB) {
            if (elementA.equals(elementB)) {
                duplicates.add(elementA);
                break;
            }
        }
    }
    
    return duplicates;
}

上述代码中,我们使用了两个嵌套的循环来遍历集合A和集合B的每一个元素。利用equals()方法来判断两个元素是否相同,如果相同则添加到一个新的集合duplicates中。最后,返回包含重复元素的集合duplicates。

2.2 方法二:使用Java 8的Stream API

Java 8引入了Stream API,它提供了丰富的操作方法来处理集合数据。我们可以使用Stream API来筛选两个集合中的重复元素。代码示例如下:

List<Integer> findDuplicates(List<Integer> listA, List<Integer> listB) {
    return listA.stream()
            .distinct()
            .filter(listB::contains)
            .collect(Collectors.toList());
}

上述代码中,我们首先使用stream()方法将集合A转换为一个流,然后使用distinct()方法去重。接着,使用filter()方法来筛选出在集合B中存在的元素,最后使用collect()方法将筛选后的元素收集到一个新的集合中。

3. 流程图

下面是使用mermaid语法绘制的流程图,展示了上述两种方法的筛选过程。

flowchart TD
    A[开始]
    B[A与B的重复元素集合]
    
    A --> B{使用循环遍历} --> B1[筛选出重复元素并添加到集合B中]
    A --> B{使用Stream API} --> B2[筛选出重复元素并添加到集合B中]
    B1 --> C[结束]
    B2 --> C

4. 示例代码

下面是一个完整的示例代码,演示了如何使用上述两种方法来筛选两个集合中的重复元素。

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class DuplicateElements {

    public static void main(String[] args) {
        List<Integer> listA = new ArrayList<>();
        listA.add(1);
        listA.add(2);
        listA.add(3);
        listA.add(4);
        listA.add(5);

        List<Integer> listB = new ArrayList<>();
        listB.add(4);
        listB.add(5);
        listB.add(6);
        listB.add(7);
        listB.add(8);

        List<Integer> duplicates1 = findDuplicatesUsingLoop(listA, listB);
        System.out.println("重复的元素(使用循环遍历):" + duplicates1);

        List<Integer> duplicates2 = findDuplicatesUsingStream(listA, listB);
        System.out.println("重复的元素(使用Stream API):" + duplicates2);
    }

    static List<Integer> findDuplicatesUsingLoop(List<Integer> listA, List<Integer> listB) {