两个不同集合的交集、并集及差集

需求

业务场景:现在给出这么一个需求,两个系统,旧系统与新系统同一个月中的数据,比对两个list找出不重复的数据,然后在进行校验。emmm......其实说通俗点,就是求两个集合的差集。

最初想法:循坏集合,判断另一个集合是否包含,不包含则新添加到一个集合,方法比较笨拙,代码繁琐。。。

那么问题来了,如何处理两个集合的差集呢?此处分为两处处理模式:

  1. java8之前版本
  2. java8中的lambda表达式处理

java8之前的旧版本处理

此处主要运用到Collection集合提供的一个方法:

  • removeAll(Collection list):removeAll方法用于从列表中移除指定collection中包含的所有元素。
  • removeAll(Collection<?> c) c:包含从列表中移除元素的collection对象。 该方法返回值为boolean对象,如果List集合对象由于调用removeAll方法而发生更改,则返回
    true,否则返回false

话不多说,上代码:

 ArrayList<Integer> list1 = new ArrayList<> ();
    ArrayList<Integer> list2 = new ArrayList<> ();
    //list1添加元素
    list1.add (1);
    list1.add (3);
    list1.add (2);
    //list2添加元素
    list2.add (3);
    list2.add (4);
    list2.add (5);
    
    //差集
    ArrayList<Integer> list3 = new ArrayList<>(list1);
    list1.removeAll(list2); //输出结果 [1,2]
    list2.removeAll(list3);//输出结果 [4,5]
    list1.addAll(list2);
    System.out.println("差集:"+list1); //输出结果

java8之后的版本处理

此处引用的是Java8的lambda表达式处理: 代码如下:

  ArrayList<Integer> list1 = new ArrayList<> ();
    ArrayList<Integer> list2 = new ArrayList<> ();
    //list1添加元素
    list1.add (1);
    list1.add (3);
    list1.add (2);
    //list2添加元素
    list2.add (3);
    list2.add (4);
    list2.add (5);
    
    //差集list1 - list2
     List<Integer> difference = list1.stream().filter(item -> !list2.contains(item)).collect(toList());
    //差集list2 - list1
     List<Integer> difference = list2.stream().filter(item -> !list1.contains(item)).collect(toList());

逻辑其实是一样的,但lamdba给人一种简洁高级的感觉,性能方面也要好很多。

题外

既然说到了差集,那索性就把并集,交集一起说了吧~~~~

公用代码

  ArrayList<Integer> list1 = new ArrayList<> ();
    ArrayList<Integer> list2 = new ArrayList<> ();
    //list1添加元素
    list1.add (1);
    list1.add (3);
    list1.add (2);
    //list2添加元素
    list2.add (3);
    list2.add (4);
    list2.add (5);

Java8之前的旧版本

其中,并集用到的方法是addAll(); 交集用到的是retainAll();

注意:retainAll()方法,切记踩坑:

例如A.retainAll(B);

  1. retainAll命令,返回的是一个boolean值;
  2. 如果AB中有相同的元素,那么A中会保留相同的元素,将不同的元素移除;
  3. 如果AB中没有相同的元素,那么会返回[]
  4. 当A中的元素有变化时会返回true,没有变化会返回false

retainAll命令返回的是两个list同时包含的内容

  1. 首先调用retainAll的方法

  2. 通过判断结果集合是否大于0,来确定是否存在交集。不能通过方法返回的True和False来判断。

当集合A的大小改变的时候返回的是True,大小没有改变的时候返回的是False

 //有重复并集
    list1.addAll(list2);
    //无重复并集
    list2.removeAll(list1);
    list1.addAll(list2);
    
    
    
    //交集
    list1.retainAll(list2);
    system.out.println(list1);

Java8之后的版本

  //并集
     List<String> listAll = list1.parallelStream().collect(toList());
     List<String> listAll2 = list2.parallelStream().collect(toList());
     listAll.addAll(listAll2);
     //去重并集
     List<String> listAllDistinct = listAll.stream().distinct().collect(toList());
     
     
     //交集
     List<String> intersection = list1.stream().filter(item -> list2.contains(item)).collect(toList());

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值