Java两个集合取差集4种方式举例

 更新时间:2024年08月03日 10:30:45   作者:只吹45°风  
在Java 编程中,经常需要对集合进行一些操作,比如取两个集合的交集、并集和差集,下面这篇文章主要给大家介绍了关于Java两个集合取差集的4种方式,需要的朋友可以参考下

开发中比较两个集合的不同点,例如需要对于两个集合取差集,下面列举了几种方式。

方式1:使用Java 8的Stream流

整个集合过滤

   List<String> list1 = Arrays.asList("a", "b", "c", "d");
   List<String> list2 = Arrays.asList("c", "d", "e", "f");

   // 获取差集
   List<String> difference1 = list1.stream()
       .filter(element -> !list2.contains(element))
       .collect(Collectors.toList());

   // 获取list2中不在list1的元素
   List<String> difference2 = list2.stream()
       .filter(element -> !list1.contains(element))
       .collect(Collectors.toList());

根据集合中对象的属性来过滤

   // 根据集合中对象的name属性来过滤
    public void testStreamNoneMatch(List<StudentDTO> originalDto, List<StudentDTO> newDto) {
        List<StudentDTO> boy = originalDto.stream()
                .filter(item -> item.getGender() == 1
                        && newDto.stream().anyMatch(dto -> dto.getName().equals(item.getName()))).collect(Collectors.toList());
        log.info("性别为男生,且名字相同的人员为{}", JSONObject.toJSONString(boy));
    }

方式2:使用Java集合类的removeAll()方法

   List<String> list1Copy = new ArrayList<>(list1);
   List<String> list2Copy = new ArrayList<>(list2);

   // 获取list1中不在list2的元素
   list1Copy.removeAll(list2);
   List<String> difference1 = list1Copy;

   // 获取list2中不在list1的元素
   list2Copy.removeAll(list1);
   List<String> difference2 = list2Copy;

方式3:使用Google Guava库的Sets.difference()方法

 List<String> list1 = ...;
   List<String> list2 = ...;

   // 获取list1中不在list2的元素
   Set<String> set1 = Sets.newHashSet(list1);
   Set<String> set2 = Sets.newHashSet(list2);
   Set<String> difference1 = Sets.difference(set1, set2);

   // 获取list2中不在list1的元素
   Set<String> difference2 = Sets.difference(set2, set1);

方式4:使用Apache Commons Collections的ListUtils.subtract()方法

   List<String> list1 = ...;
   List<String> list2 = ...;

   // 获取list1中不在list2的元素
   List<String> difference1 = ListUtils.subtract(list1, list2);

   // 获取list2中不在list1的元素
   List<String> difference2 = ListUtils.subtract(list2, list1);

注意:方式有很多,大家可根据项目需求和已引入的库,选择合适的方法来计算集合的差集。

附:取重复元素

方法一:使用HashSet

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class ListUtils {
    /**
     * 找出两个List中的重复元素
     * @param list1 第一个List
     * @param list2 第二个List
     * @return 重复的元素集合
     */
    public static <T> List<T> findDuplicateElements(List<T> list1, List<T> list2) {
        Set<T> set1 = new HashSet<>(list1); // 将List1转换为Set,去除重复元素
        Set<T> duplicateSet = new HashSet<>();
        
        for (T element : list2) { // 遍历List2的元素
            if (set1.contains(element)) { // 如果Set1中包含List2的元素
                duplicateSet.add(element); // 将重复的元素添加到重复元素的Set中
            }
        }
        
        return new ArrayList<>(duplicateSet); // 将重复元素的Set转换回List并返回
    }
}

方法二:使用Stream API

import java.util.*;
import java.util.stream.Collectors;
public class Main {
    public static void main(String[] args) {
        List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);
        // 将列表转换为Stream
        Stream<Integer> stream1 = list1.stream();
        Stream<Integer> stream2 = list2.stream();
        // 找出两个Stream的重复元素
        List<Integer> commonElements = Stream.concat(stream1, stream2)
                                             .distinct()
                                             .collect(Collectors.toList());
        // 打印出重复元素
        System.out.println(commonElements);
    }
}

方法三:使用HashMap

import java.util.*;
public class Main {
    public static void main(String[] args) {
        List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);
        // 将列表转换为HashMap
        Map<Integer, Integer> map = new HashMap<>();
        list1.forEach(i -> map.put(i, map.getOrDefault(i, 0) + 1));
        list2.forEach(i -> map.put(i, map.getOrDefault(i, 0) + 1));
        // 找出HashMap中值大于1的键,即为重复元素
        List<Integer> commonElements = map.entrySet().stream()
                                         .filter(x -> x.getValue() > 1)
                                         .map(Map.Entry::getKey)
                                         .collect(Collectors.toList());
        // 打印出重复元素
        System.out.println(commonElements);
    }
}

总结

到此这篇关于Java两个集合取差集4种方式的文章就介绍到这了,更多相关Java两个集合取差集内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring HandlerInterceptor实现原理代码解析

    Spring HandlerInterceptor实现原理代码解析

    这篇文章主要介绍了Spring HandlerInterceptor实现原理代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 一文带你搞懂Java中方法重写与方法重载的区别

    一文带你搞懂Java中方法重写与方法重载的区别

    这篇文章主要介绍了Java中方法重写与方法重载有哪些区别,文中有详细的代码示例,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-05-05
  • Java实现数据库连接的最详细教程分享

    Java实现数据库连接的最详细教程分享

    JDBC,Java Database Connectivity,即Java数据库连接,是 Java 中的一套和数据库进行交互的API,本文就来讲讲Java如何利用JDBC实现数据库的连接吧
    2023-05-05
  • Spring中获取Bean对象的三种注入方式与两种注入方法详解

    Spring中获取Bean对象的三种注入方式与两种注入方法详解

    平常的Java开发中程序员在某个类中需要依赖其它类的方法,下面这篇文章主要给大家介绍了关于Spring中获取Bean对象的三种注入方式与两种注入方法的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • Spring如何基于aop实现事务控制

    Spring如何基于aop实现事务控制

    这篇文章主要介绍了Spring如何基于aop实现事务控制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java设计模式之静态代理模式实例分析

    Java设计模式之静态代理模式实例分析

    这篇文章主要介绍了Java设计模式之静态代理模式,结合实例形式分析了静态代理模式的概念、原理、定义与用法,需要的朋友可以参考下
    2018-04-04
  • 浅谈SpringBoot内嵌Tomcat的实现原理解析

    浅谈SpringBoot内嵌Tomcat的实现原理解析

    这篇文章主要介绍了浅谈SpringBoot内嵌Tomcat的实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 基于spring-security 401 403错误自定义处理方案

    基于spring-security 401 403错误自定义处理方案

    这篇文章主要介绍了基于spring-security 401 403错误自定义处理方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • MybatisPlus调用原生SQL的三种方法实例详解

    MybatisPlus调用原生SQL的三种方法实例详解

    这篇文章主要介绍了MybatisPlus调用原生SQL的三种方法,在有些情况下需要用到MybatisPlus查询原生SQL,MybatisPlus其实带有运行原生SQL的方法,我这里列举三种,需要的朋友可以参考下
    2022-09-09
  • SpringBoot中集成串口通信的项目实践

    SpringBoot中集成串口通信的项目实践

    本文主要介绍了SpringBoot中集成串口通信,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08

最新评论