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方法,就会带来这种不相等的情况,从而导致失效,这个问题也要注意一下。

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java 8 中可以使用 Stream API 来实现集合之间的交集并集差集去重并集。 假设有两个 List 集合list1 和 list2,分别包含一些元素,代码如下: ```java List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5); List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8); ``` 下面分别介绍如何实现集合之间的操作。 1. 取交集交集即获取两个集合中共同拥有的元素。可以使用 Stream API 的 `filter()` 方法和 `contains()` 方法实现。代码如下: ```java List<Integer> intersection = list1.stream() .filter(list2::contains) .collect(Collectors.toList()); System.out.println("交集:" + intersection); // 输出 [4, 5] ``` 2. 取并集并集即获取两个集合中所有的元素,但是去重。可以使用 Stream API 的 `distinct()` 方法和 `concat()` 方法实现。代码如下: ```java List<Integer> union = Stream.concat(list1.stream(), list2.stream()) .distinct() .collect(Collectors.toList()); System.out.println("并集:" + union); // 输出 [1, 2, 3, 4, 5, 6, 7, 8] ``` 3. 取差集差集即获取两个集合中不同的元素。可以使用 Stream API 的 `filter()` 方法和 `!contains()` 方法实现。代码如下: ```java List<Integer> diff1 = list1.stream() .filter(e -> !list2.contains(e)) .collect(Collectors.toList()); System.out.println("差集1:" + diff1); // 输出 [1, 2, 3] List<Integer> diff2 = list2.stream() .filter(e -> !list1.contains(e)) .collect(Collectors.toList()); System.out.println("差集2:" + diff2); // 输出 [6, 7, 8] ``` 4. 去重并集 去重并集即获取两个集合中所有的元素,并且去重。可以使用 Stream API 的 `distinct()` 方法和 `flatMap()` 方法实现。代码如下: ```java List<Integer> distinctUnion = Stream.of(list1, list2) .flatMap(List::stream) .distinct() .collect(Collectors.toList()); System.out.println("去重并集:" + distinctUnion); // 输出 [1, 2, 3, 4, 5, 6, 7, 8] ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值