Java多个集合求交集

引言

在开发过程中,经常会遇到需要对多个集合进行求交集的需求。Java提供了多种方法来实现这一功能,本文将介绍几种常见的方法,并给出相应的代码示例。

方法一:使用retainAll()方法求交集

Java中的集合类都实现了Collection接口,该接口提供了一个retainAll()方法,用于计算当前集合与指定集合之间的交集。该方法会移除当前集合中不包含在指定集合中的元素。

代码示例:

List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
List<Integer> list2 = new ArrayList<>(Arrays.asList(3, 4, 5, 6, 7));

list1.retainAll(list2);

System.out.println(list1);  // 输出:[3, 4, 5]

上述代码中,我们首先创建了两个List对象list1list2,分别初始化为[1, 2, 3, 4, 5][3, 4, 5, 6, 7]。然后调用list1retainAll()方法,传入list2作为参数,即可得到两个集合的交集。

需要注意的是,该方法会直接修改当前集合,因此在使用前应对当前集合进行备份,以免数据丢失。

方法二:使用stream()方法求交集

Java 8引入了流(Stream)API,可以使用流的filter()方法对集合进行筛选操作。通过将两个集合转换为流,我们可以使用filter()方法来筛选出两个集合的交集。

代码示例:

List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
List<Integer> list2 = new ArrayList<>(Arrays.asList(3, 4, 5, 6, 7));

List<Integer> intersection = list1.stream()
        .filter(list2::contains)
        .collect(Collectors.toList());

System.out.println(intersection);  // 输出:[3, 4, 5]

上述代码中,我们利用流的filter()方法将list1中与list2中的元素相同的元素筛选出来,最终使用collect()方法将筛选结果收集到一个新的集合中。

需要注意的是,这种方法的时间复杂度较高,因为在筛选过程中需要遍历整个list2集合。

方法三:使用Set求交集

除了使用List接口的方法求交集,我们还可以使用Set接口的方法来实现。Set接口的实现类(如HashSetTreeSet等)都提供了一个retainAll()方法,用于计算当前集合与指定集合之间的交集。

代码示例:

Set<Integer> set1 = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5));
Set<Integer> set2 = new HashSet<>(Arrays.asList(3, 4, 5, 6, 7));

set1.retainAll(set2);

System.out.println(set1);  // 输出:[3, 4, 5]

上述代码中,我们创建了两个Set对象set1set2,分别初始化为[1, 2, 3, 4, 5][3, 4, 5, 6, 7]。然后调用set1retainAll()方法,传入set2作为参数,即可得到两个集合的交集。

需要注意的是,与方法一类似,retainAll()方法会直接修改当前集合,因此在使用前应对当前集合进行备份。

方法四:使用Apache Commons Collections工具类

Apache Commons Collections是一个开源的Java集合类库,提供了许多有用的工具类和方法。其中,CollectionUtils类提供了一个intersection()方法,用于计算多个集合的交集。

代码示例:

List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
List<Integer> list2 = new ArrayList<>(Arrays.asList(3,