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
对象list1
和list2
,分别初始化为[1, 2, 3, 4, 5]
和[3, 4, 5, 6, 7]
。然后调用list1
的retainAll()
方法,传入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
接口的实现类(如HashSet
、TreeSet
等)都提供了一个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
对象set1
和set2
,分别初始化为[1, 2, 3, 4, 5]
和[3, 4, 5, 6, 7]
。然后调用set1
的retainAll()
方法,传入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,