一、概述
1、在日常开发中,经常会遇到对2个集合的操作,例如:2个集合之间取相同的元素(交集),2个集合之间取不相同的元素(差集) 等等。。。
2、本文系统性的整理,Java中 集合 交集、并集、差集、补集的处理办法,并提供多种办法实现,由浅入深 --- 简化到最后一行代码实现。
3、概念定义:
(PS:此处应该有个图来,更好理解!)
二、代码实现理解
1、假设有2个集合,list1 和 list2 ,元素分别如下:
- ArrayList
list1 = Lists.newArrayList(1,2,3); - ArrayList
list2 = Lists.newArrayList(3,4,5);
2、取交集 --- 手动遍历集合实现
- /**@Description: 取交集
- * @version v1.0
- * @author wu
- * @date 2022/7/30 22:41
- */
- @Test
- public void intersectionTest1(){
- ArrayList
- for (Integer e1 : list1) {
- for (Integer e2 : list2) {
- if(e1.equals(e2)){
- destList.add(e1);
- }
- }
- }
- System.out.println("intersectionTest1 交集结果是: " + destList);
-
- list1.retainAll(list2);
- System.out.println("intersectionTest1 retainAll 方法 交集结果是: " + list1);
- }
2.1、取交集 --- 使用 CollectionUtils 工具类
- /**@Description: 取交集 , 使用 CollectionUtils 工具类
- * @version v1.0
- * @author wu
- * @date 2022/7/30 22:55
- */
- @Test
- public void intersectionTest2(){
- Collection intersection = CollectionUtils.intersection(list1, list2);
- System.out.println("intersectionTest2 交集结果是: " + intersection);
- }
3、取并集 --- 使用Set集合实现
- /**@Description: 取并集
- * @version v1.0
- * @author wu
- * @date 2022/7/30 23:00
- */
- @Test
- public void unionTest1(){
- list1.addAll(list2);
- System.out.println("unionTest1 并集 :" + list1);
-
- // 并集 去重
- HashSet
set = Sets.newHashSet(); - set.addAll(list1);
- set.addAll(list2);
- System.out.println("unionTest1 并集 去重 :" + set);
- }
3.1、取并集 , 使用 CollectionUtils 实现
- /**@Description: 取并集 , 使用 CollectionUtils 实现
- * @version v1.0
- * @author wu
- * @date 2022/7/30 23:02
- */
- @Test
- public void unionTest2(){
- Collection union = CollectionUtils.union(list1, list2);
- System.out.println("unionTest2 并集 :" + union);
- }
4、取差集 , 使用 removeAll 方法实现
- /**@Description: 取 差集 , list1 - list2
- * @version v1.0
- * @author wu
- * @date 2022/7/30 23:37
- */
- @Test
- public void subtractTest1(){
- list1.removeAll(list2);
- System.out.println("subtractTest1 差集: " + list1);
- }
4.1、取差集,使用 CollectionUtils 工具类
- /**@Description: 取 差集 ,使用 CollectionUtils 工具类
- * @version v1.0
- * @author wu
- * @date 2022/7/30 23:46
- */
- @Test
- public void subtractTest2(){
- Collection subtract = CollectionUtils.subtract(list1, list2);
- System.out.println("subtractTest2 差集: " + subtract);
- }
5、取补集,使用 list 循环对比
- /**@Description: 取补集 --- 使用 list 循环对比
- * @version v1.0
- * @author wu
- * @date 2022/7/30 23:03
- */
- @Test
- public void disjunctionTest1(){
- ArrayList
destList = Lists.newArrayList(); - boolean flag = false;
- for (Integer e1 : list1) {
- for (Integer e2 : list2) {
- if(e1.equals(e2)){
- flag = true;
- break;
- }
- }
- if (!flag) {
- destList.add(e1);
- } else {
- flag = false;
- }
- }
-
- // list1 和 list2 换位置对比下
- flag = false;
- for (Integer e1 : list2) {
- for (Integer e2 : list1) {
- if(e1.equals(e2)){
- flag = true;
- break;
- }
- }
- if(!flag){
- destList.add(e1);
- }else {
- flag = false;
- }
- }
- System.out.println("disjunctionTest1 补集:" +destList);
- }
5.1、取补集 --- 使用Map对比
- /**@Description: 取补集 --- 使用Map对比
- * @version v1.0
- * @author wu
- * @date 2022/7/30 23:18
- */
- @Test
- public void disjunctionTest2() {
- ArrayList
destList = Lists.newArrayList(); - Map
map1 = list1.stream().collect(Collectors.toMap(k -> k, v -> v)); - Map
map2 = list2.stream().collect(Collectors.toMap(k -> k, v -> v)); -
- map1.forEach((k,v)->{
- Integer val = map2.get(k);
- if(null == val){
- destList.add(k);
- }
- });
-
- map2.entrySet().stream().forEach(e->{
- Integer key = e.getKey();
- Integer val = map1.get(key);
- if(null == val){
- destList.add(key);
- }
- });
- System.out.println("disjunctionTest2 补集:" +destList);
- }
5.2、取补集 --- 使用 CollectionUtils.disjunction 方法
- /**@Description: 取补集 --- 使用 CollectionUtils.disjunction 方法
- * @version v1.0
- * @author wu
- * @date 2022/7/30 23:56
- */
- @Test
- public void disjunctionTest3() {
- Collection disjunction = CollectionUtils.disjunction(list1, list2);
- System.out.println("disjunctionTest3 补集:" +disjunction);
- }
5.3、取补集 --- 使用 list1 和 list2相互差集,再并集
- /**@Description: 取补集 --- 使用 list1 和 list2相互差集,再并集
- * @version v1.0
- * @author wu
- * @date 2022/7/30 23:57
- */
- @Test
- public void disjunctionTest4() {
- Collection s1 = CollectionUtils.subtract(list1, list2);
- Collection s2 = CollectionUtils.subtract(list2, list1);
- Collection union = CollectionUtils.union(s1, s2);
- System.out.println("disjunctionTest4 补集 , 2个差集再并集:" +union);
- }
注:以上代码,输出结果略,请自行粘贴代码测试!
三、总结
1、本文记录了 Java中List集合的常见处理,可以手动写方法实现,也可以偷懒,直接借用已经造好的轮子,一行代码实现。多多熟悉这些工具类常见的API使用,提高工作效率,为 ... 摸鱼 .... 争取更多的时间。
2、其中依赖的 pom有:
- <dependency>
- <groupId>org.apache.commonsgroupId>
- <artifactId>commons-lang3artifactId>
- <version>3.8.1version>
- dependency>
可能需要知道的:
Idea 设置方法注释模板 Idea 2021.2配置方法类注释模板_HaHa_Sir的博客-CSDN博客_idea设置方法注释模板
Eclipse配置代码注释模板 Eclipse代码注释模板 Eclipse设置方法注释模板_HaHa_Sir的博客-CSDN博客_eclipse代码注释模板