Java List 集合取 交集、并集、差集、补集 Java集合取交集、Java集合并集

一、概述

1、在日常开发中:

经常会遇到对2个集合的操作,例如:2个集合之间取相同的元素(交集),2个集合之间取不相同的元素(差集) 等等。。。

2、本文系统性的整理:

Java中 集合 交集、并集、差集、补集的处理办法,并提供多种办法实现,由浅入深 --- 简化到最后一行代码实现。

3、概念定义:

  • 交集: 取2个集合中,相同的部分 (list1 交集 list2,取 list1和list2 中相同的元素)
  • 并集: 将2个集合,合并为一个集合中
  • 差集: 取2个集合中,不相同的部分 (list1 差集 list2 ,取 list1中与list2 不相同的元素)
  • 补集: 取2个集合中,不相同的部分 ,组成新集合 ( list1 差集 list2 并 list2 差集 list1)

(PS:此处应该有个图来,更好理解!)

二、代码实现理解

1、假设有2个集合,list1 和 list2 ,元素分别如下:

ArrayList<Integer> list1 = Lists.newArrayList(1,2,3);
ArrayList<Integer> list2 = Lists.newArrayList(3,4,5);

2、取交集 --- 手动遍历集合实现

/**@Description: 取交集* @version v1.0* @author wu* @date 2022/7/30 22:41*/
@Test
public void intersectionTest1(){ArrayList<Object> destList = Lists.newArrayList();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);
}

2.2、取交集 --- 通用方法 实现

list1 交集 list2 ,不用生成新的list ,使用 迭代器 Iterator 删除 list1中和list2 不相同的元素。 (list集合元素删除见文章:https://thinkcode.blog.csdn.net/article/details/80295755)

(2022年11月15日22:21:35 增加)

 /*** Description: 测试 通用List集合取值交集的方法* @return  void* @version v1.0* @author wu* @date 2022/11/15 22:15*/@Testpublic void intersectionListTest() throws Exception {System.out.println("srcList : \n"+ JSON.toJSONString(list));System.out.println("subList : \n"+ JSON.toJSONString(subList));intersectionList(list,subList,(t1,t2)->{if(t1.equals(t2)){return 0;}return -1;});}/*** Description: 通用List集合取值交集的方法* @param srcList* @param subList* @param comparator* @return  void* @version v1.0* @author wu* @date 2022/11/15 22:05*/public <E>void intersectionList(List<E> srcList , List<E> subList , Comparator<E> comparator){for (Iterator<E> it = srcList.iterator(); it.hasNext(); ) {final E next = it.next();boolean isMatch = false;for (E e : subList) {if(comparator.compare(next,e) == 0){isMatch = true;break;}}if(!isMatch){it.remove();}}System.out.println("srcList 交集后: \n"+ JSON.toJSONString(list));System.out.println("subList 交集后: \n"+ JSON.toJSONString(subList));}

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<Integer> 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<Integer> 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<Integer> destList = Lists.newArrayList();Map<Integer, Integer> map1 = list1.stream().collect(Collectors.toMap(k -> k, v -> v));Map<Integer, Integer> 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.commons</groupId><artifactId>commons-lang3</artifactId><version>3.8.1</version>
</dependency>

可能需要知道的:

Idea 设置方法注释模板 Idea 2021.2配置方法类注释模板_HaHa_Sir的博客-CSDN博客_idea设置方法注释模板

Eclipse配置代码注释模板 Eclipse代码注释模板 Eclipse设置方法注释模板_HaHa_Sir的博客-CSDN博客_eclipse代码注释模板

Java List 集合取 交集、并集、差集、补集 Java集合取交集、Java集合并集相关推荐

  1. List和set集合:交集、差集、合集的区别retainAll,removeAll、addAll

    set .list集合的交集(retainAll).差集(removeAll)是没有区别的都是一样的. set .list集合的合集addAll是有区别的:set可以去重复:list不去重复 publ ...

  2. java实现交集并集差集

    java实现交集并集差集 ***`package 第一次模拟测试; import java.util.ArrayList; import java.util.HashSet; import java. ...

  3. oracle 并集 时间_Oracle集合运算符 交集 并集 差集

    集合运算符:UNION/UNION ALL 并集,INTERSECT 交集,MINUS 差集 一.union求并集,公共部分只有包含一次 例:求emp表ename中含'A'或含有'M' SQL> ...

  4. A和B 单链表表示 集合,求其 交集 并集 差集

    A和B 单链表表示 集合的 交集 并集 差集 /* A和B 单链表表示 集合的 交集 并集 差集 */ //#include <iostream> //using namespace st ...

  5. 集合判断哪非空 、2个集合取交集/并集/差集

    文章目录 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-co ...

  6. JAVA集合取交集工具类_集合交集、差集工具类

    1.业务背景 在日常开发中,有时会遇到需要对比两个集合来计算出两个集合的交集.差集.以此来决定之后对数据库的insert.delete.update操作.例如,在一些管理系统中配置管理员列表后,如果需 ...

  7. Java正则表达式--字符集范围:并集、交集和差集

    Java正则表达式教程: http://www.java3z.com/cwbwebhome/article/article8/Regex/Java.Regex.Tutorial.html 其中第三章中 ...

  8. java 求交集 算法_Java计算交集,差集,并集的方法示例

    Java计算交集,差集,并集的方法示例 发布时间:2020-10-07 10:37:46 来源:脚本之家 阅读:106 作者:benbenkui 本文实例讲述了Java计算交集,差集,并集的方法.分享 ...

  9. Python:列表、集合等交集、并集、差集、非集简介及其代码实现之详细攻略

    Python:列表.集合等交集.并集.差集.非集简介及其代码实现之详细攻略 目录 列表.集合等交集.并集.差集.非集简介及其代码实现之详细攻略 1.交集:A & B & C & ...

  10. lambda 对象去重_采用java8 lambda表达式 实现 java list 交集 并集 差集 去重复并集...

    采用java8 lambda表达式 实现java list 交集/并集/差集/去重并集 一般的javaList 交.并集采用简单的 removeAll retainAll 等操作,不过这也破坏了原始的 ...

最新文章

  1. 群晖共享文件夹局域网通过SMB本地访问
  2. web个人主页制作代码_关于嵌入式web服务器
  3. MyBatis学习总结(14)——Mybatis使用技巧总结
  4. 【Qt】Qt数据库驱动层
  5. 学习不一样的vue实战(1): 环境搭建
  6. 【华为云技术分享】“敏捷+ DevOps”先行,效能提升助推企业升级
  7. C语言中volatile关键字与汇编__volatile__
  8. 微信公众号根据URL取文章详情 API 返回值说明
  9. [Houdini 程序化生成] 基于UV的生成工具
  10. 电子信息类包含计算机科学与技术么,电子信息类和计算机类有什么区别
  11. 十大宽带共享组网方式(转)
  12. 深度学习图像数据库总结(收藏用)
  13. 深圳水上乐园有哪些 而且便宜还好玩
  14. 通过数据了解用户——数据在新品设计中的应用
  15. Aspose.CAD库简介
  16. [面试题][Java]当当、映客直播
  17. 计算机专业毕设都需要哪些准备,计算机专业本科毕设指南.ppt
  18. python前端基础知识总结 及部分练习题
  19. http请求头header、请求体body、请求行介绍
  20. 前端开发入门教程-HTML标签(上)

热门文章

  1. linux调试网络设备,android linux wifi 等网络设备调试命令总结
  2. Error in library(patRoon) : 不存在叫‘patRoon‘这个名字的程辑包
  3. 如何提高团队开发质量
  4. burst什么意思_burst是什么意思_burst在线翻译_英语_读音_用法_例句_海词词典
  5. 世界读书日之后聊聊读书
  6. 【整理】爬取网页数据的方法汇总
  7. 简单3步,给小程序加个官方的吐槽功能吧!
  8. Kotlin从入门到掉坑
  9. FaceBook和Google广告API接口文档
  10. Redis-事务(集成SpringBoot工程)