码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java List 集合取 交集、并集、差集、补集 Java集合取交集、Java集合并集


            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 ,元素分别如下:

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

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

    1. /**@Description: 取交集
    2. * @version v1.0
    3. * @author wu
    4. * @date 2022/7/30 22:41
    5. */
    6. @Test
    7. public void intersectionTest1(){
    8. ArrayList destList = Lists.newArrayList();
    9. for (Integer e1 : list1) {
    10. for (Integer e2 : list2) {
    11. if(e1.equals(e2)){
    12. destList.add(e1);
    13. }
    14. }
    15. }
    16. System.out.println("intersectionTest1 交集结果是: " + destList);
    17. list1.retainAll(list2);
    18. System.out.println("intersectionTest1 retainAll 方法 交集结果是: " + list1);
    19. }
    20.         2.1、取交集 --- 使用 CollectionUtils 工具类

      1. /**@Description: 取交集 , 使用 CollectionUtils 工具类
      2. * @version v1.0
      3. * @author wu
      4. * @date 2022/7/30 22:55
      5. */
      6. @Test
      7. public void intersectionTest2(){
      8. Collection intersection = CollectionUtils.intersection(list1, list2);
      9. System.out.println("intersectionTest2 交集结果是: " + intersection);
      10. }

              3、取并集 --- 使用Set集合实现

      1. /**@Description: 取并集
      2. * @version v1.0
      3. * @author wu
      4. * @date 2022/7/30 23:00
      5. */
      6. @Test
      7. public void unionTest1(){
      8. list1.addAll(list2);
      9. System.out.println("unionTest1 并集 :" + list1);
      10. // 并集 去重
      11. HashSet set = Sets.newHashSet();
      12. set.addAll(list1);
      13. set.addAll(list2);
      14. System.out.println("unionTest1 并集 去重 :" + set);
      15. }

              3.1、取并集 , 使用 CollectionUtils 实现

      1. /**@Description: 取并集 , 使用 CollectionUtils 实现
      2. * @version v1.0
      3. * @author wu
      4. * @date 2022/7/30 23:02
      5. */
      6. @Test
      7. public void unionTest2(){
      8. Collection union = CollectionUtils.union(list1, list2);
      9. System.out.println("unionTest2 并集 :" + union);
      10. }

              4、取差集 , 使用 removeAll 方法实现

      1. /**@Description: 取 差集 , list1 - list2
      2. * @version v1.0
      3. * @author wu
      4. * @date 2022/7/30 23:37
      5. */
      6. @Test
      7. public void subtractTest1(){
      8. list1.removeAll(list2);
      9. System.out.println("subtractTest1 差集: " + list1);
      10. }

              4.1、取差集,使用 CollectionUtils 工具类

      1. /**@Description: 取 差集 ,使用 CollectionUtils 工具类
      2. * @version v1.0
      3. * @author wu
      4. * @date 2022/7/30 23:46
      5. */
      6. @Test
      7. public void subtractTest2(){
      8. Collection subtract = CollectionUtils.subtract(list1, list2);
      9. System.out.println("subtractTest2 差集: " + subtract);
      10. }

              5、取补集,使用 list 循环对比

      1. /**@Description: 取补集 --- 使用 list 循环对比
      2. * @version v1.0
      3. * @author wu
      4. * @date 2022/7/30 23:03
      5. */
      6. @Test
      7. public void disjunctionTest1(){
      8. ArrayList destList = Lists.newArrayList();
      9. boolean flag = false;
      10. for (Integer e1 : list1) {
      11. for (Integer e2 : list2) {
      12. if(e1.equals(e2)){
      13. flag = true;
      14. break;
      15. }
      16. }
      17. if (!flag) {
      18. destList.add(e1);
      19. } else {
      20. flag = false;
      21. }
      22. }
      23. // list1 和 list2 换位置对比下
      24. flag = false;
      25. for (Integer e1 : list2) {
      26. for (Integer e2 : list1) {
      27. if(e1.equals(e2)){
      28. flag = true;
      29. break;
      30. }
      31. }
      32. if(!flag){
      33. destList.add(e1);
      34. }else {
      35. flag = false;
      36. }
      37. }
      38. System.out.println("disjunctionTest1 补集:" +destList);
      39. }

              5.1、取补集 --- 使用Map对比

      1. /**@Description: 取补集 --- 使用Map对比
      2. * @version v1.0
      3. * @author wu
      4. * @date 2022/7/30 23:18
      5. */
      6. @Test
      7. public void disjunctionTest2() {
      8. ArrayList destList = Lists.newArrayList();
      9. Map map1 = list1.stream().collect(Collectors.toMap(k -> k, v -> v));
      10. Map map2 = list2.stream().collect(Collectors.toMap(k -> k, v -> v));
      11. map1.forEach((k,v)->{
      12. Integer val = map2.get(k);
      13. if(null == val){
      14. destList.add(k);
      15. }
      16. });
      17. map2.entrySet().stream().forEach(e->{
      18. Integer key = e.getKey();
      19. Integer val = map1.get(key);
      20. if(null == val){
      21. destList.add(key);
      22. }
      23. });
      24. System.out.println("disjunctionTest2 补集:" +destList);
      25. }

              5.2、取补集 --- 使用 CollectionUtils.disjunction 方法

      1. /**@Description: 取补集 --- 使用 CollectionUtils.disjunction 方法
      2. * @version v1.0
      3. * @author wu
      4. * @date 2022/7/30 23:56
      5. */
      6. @Test
      7. public void disjunctionTest3() {
      8. Collection disjunction = CollectionUtils.disjunction(list1, list2);
      9. System.out.println("disjunctionTest3 补集:" +disjunction);
      10. }

              5.3、取补集 --- 使用 list1 和 list2相互差集,再并集

      1. /**@Description: 取补集 --- 使用 list1 和 list2相互差集,再并集
      2. * @version v1.0
      3. * @author wu
      4. * @date 2022/7/30 23:57
      5. */
      6. @Test
      7. public void disjunctionTest4() {
      8. Collection s1 = CollectionUtils.subtract(list1, list2);
      9. Collection s2 = CollectionUtils.subtract(list2, list1);
      10. Collection union = CollectionUtils.union(s1, s2);
      11. System.out.println("disjunctionTest4 补集 , 2个差集再并集:" +union);
      12. }

              注:以上代码,输出结果略,请自行粘贴代码测试!

      三、总结

              1、本文记录了 Java中List集合的常见处理,可以手动写方法实现,也可以偷懒,直接借用已经造好的轮子,一行代码实现。多多熟悉这些工具类常见的API使用,提高工作效率,为 ... 摸鱼 .... 争取更多的时间。

              2、其中依赖的 pom有:

      1. <dependency>
      2. <groupId>org.apache.commonsgroupId>
      3. <artifactId>commons-lang3artifactId>
      4. <version>3.8.1version>
      5. dependency>

      可能需要知道的:

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

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

    21. 相关阅读:
      大数据_数据中台建设与架构
      HTML5期末考核大作业,电影网站——橙色国外电影 web期末作业设计网页
      mock的基本用法
      广东MES系统在电子厂的重要性
      分布式锁的实现(一)Redis篇
      分类与回归梯度下降公式推导
      css知识点总结
      Java学习笔记(二)
      ShowMeAI —— Show u 三连
      文字上屏展示,文本内容自动滚动下一行
    22. 原文地址:https://blog.csdn.net/HaHa_Sir/article/details/126111603
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | Kerberos协议及其部分攻击手法
        0day的产生 | 不懂代码的"代码审计"
        安装scrcpy-client模块av模块异常,环境问题解决方案
        leetcode hot100【LeetCode 279. 完全平方数】java实现
        OpenWrt下安装Mosquitto
        AnatoMask论文汇总
        【AI日记】24.11.01 LangChain、openai api和github copilot
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
      正则表达式工具 cron表达式工具 密码生成工具

      京公网安备 11010502049817号