• JAVA——两个List集合求交集、并集和差集(去重)模板


    技术公众号:后端技术解忧铺
    关注微信公众号:CodingTechWork,一起学习进步。

    引言

      经常遇到一些集合类之间的过滤数据、求合集之类的问题,在此以List为例,毕竟在数据库中取数据后,我们使用比较多的是List集合进行操作。

    模板

    代码

    public static void main(String[] args) {
            List<String> stringList = new ArrayList<>();
            stringList.add("a");
            stringList.add("b");
            stringList.add("c");
            stringList.add("i");
            stringList.add("j");
            stringList.add("a");
    
            //一、求交集
            //方法1:直接通过retainAll直接过滤
            List<String> stringList1 =  new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
            stringList1.retainAll(stringList);
            System.out.println("交集1: " + stringList1);
    
            //方法2:通过过滤掉存在于stringList的数据
            List<String> stringList1_2 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
            List<String> strings = stringList1_2.stream()
                    .filter(item -> stringList.contains(item))
                    .collect(toList());
            System.out.println("交集2:" + strings);
    
            //二、并集
            //有重并集
            List<String> stringList2 =  new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
            stringList2.addAll(stringList);
            System.out.println("并集: " + stringList2);
    
            //无重并集
            List<String> stringList2_2 =  new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
            List<String> stringList_1 =  new ArrayList<>(Arrays.asList("a,b,c,i,j,a".split(",")));
            stringList2_2.removeAll(stringList_1);
            stringList_1.addAll(stringList2_2);
    
            System.out.println("无重并集: " + stringList_1);
    
            //三、求差集
            //方法1:直接使用removeAll()方法
            List<String> stringList3 =  new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
            stringList3.removeAll(stringList);
            System.out.println("差集1: " + stringList3);
    
            //方法2:通过过滤掉不存在于stringList的数据,然后和本数组进行交集处理
            List<String> stringList3_2 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
            stringList3_2.retainAll(stringList3_2.stream()
                    .filter(item -> !stringList.contains(item))
                    .collect(toList()));
            System.out.println("差集2:" + stringList3_2);
    
            SpringApplication.run(DemoApplication.class, args);
        }
    

    结果

    交集1: [a, b, c]
    交集2:[a, b, c]
    并集: [a, b, c, d, e, f, g, h, a, b, c, i, j, a]
    无重并集: [a, b, c, i, j, a, d, e, f, g, h]
    差集1: [d, e, f, g, h]
    差集2:[d, e, f, g, h]
    

    注意list赋值问题

      如果使用了赋值方式,如list1 = list0,然后list1.retainAll(list2)或者list1.removeAll(list2)其实list0的值也变化了。因为lis1和list0指向了同一个地址。
    代码

            List<String> s1 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
            List<String> s2 = s1;
            System.out.println("s1地址和s2是否相等(是否为同一个对象): " + (s1 == s2));
            s2.remove("g");
            s2.remove("h");
            System.out.println("s1: " + s1);
            System.out.println("s2: " + s2);
    

    结果

    s1地址和s2是否相等(是否为同一个对象): true
    s1: [a, b, c, d, e, f]
    s2: [a, b, c, d, e, f]
    

    所以我们需要使用 List<String> list1= new ArrayList<>(list0);的方式
    代码

            List<String> s1 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
            List<String> s2 = new ArrayList<>(s1);
            System.out.println("s1地址和s2是否相等(是否为同一个对象): " + (s1 == s2));
            s2.remove("g");
            s2.remove("h");
            System.out.println("s1: " + s1);
            System.out.println("s2: " + s2);
    

    结果

    s1地址和s2是否相等(是否为同一个对象): false
    s1: [a, b, c, d, e, f, g, h]
    s2: [a, b, c, d, e, f]
    

      同时,我们1在使用removeAll()方法时,有时候会遇到报错或者失效的情形,比如List中是一个一个对象类,且没有重写过equals和hashCode方法,就会带来这种不相等的情况,从而导致失效,这个问题也要注意一下。

  • 相关阅读:
    time 类
    案例:手动输入一个字符串,所有字符反转,大小写相互转
    案例:使用列表年月日 计算这个日期是这一天的多少天
    用python输出1-100之间所有的质数
    案例:手动输入一个字符串,打散放进一个列表,小写字母反序 大写字母保持不变
    安装数据库教程
    PHP use MySQLi
    PHP logging
    Vagrant
    Flask基础
  • 原文地址:https://www.cnblogs.com/Andya/p/14037640.html
Copyright © 2020-2023  润新知