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

需求

业务场景:现在给出这么一个需求,两个系统,旧系统与新系统同一个月中的数据,比对两个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 list1 = new ArrayList<> ();
    ArrayList list2 = new ArrayList<> ();
    //list1添加元素
    list1.add (1);
    list1.add (3);
    list1.add (2);
    //list2添加元素
    list2.add (3);
    list2.add (4);
    list2.add (5);
    
    //差集
    ArrayList 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 list1 = new ArrayList<> ();
    ArrayList 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 difference = list1.stream().filter(item -> !list2.contains(item)).collect(toList());
    //差集list2 - list1
     List difference = list2.stream().filter(item -> !list1.contains(item)).collect(toList());

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

题外

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

公用代码

  ArrayList list1 = new ArrayList<> ();
    ArrayList 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()方法,切记踩坑:

  1. retainAll命令,返回的是一个boolean值;
  2. 如果结果修改了第一个list就返回true,没修改就返回false,结果会直接修改第一个list;
  3. 如果第2个list是第一个的子集,就不会修改第一个list。retainAll命令返回的是两个list同时包含的内容

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

 

你可能感兴趣的:(Java)