java集合List快速实现重复判断的方法小结

 更新时间:2024年12月31日 08:21:37   作者:荧光石  
在java编写代码中经常会遇到某些重复判定或者去重的操作,本文主要为大家介绍了几个常用方法,感兴趣的小伙伴可以跟随不想一起学习一下

在java编写代码中经常会遇到某些重复判定或者去重的操作,包括:

  • 数据清洗:从数据库或其他来源获取的数据可能包含重复项,需要去重。
  • 用户输入:前段传入的数据可能存在重复,需要校验去除重来避免处理时出现错误或不一致。
  • 列表合并:将多个列表合并后,可能会产生重复元素,去重也是合并后常见的操作。

以下是用来记录会用到的去重操作,以防忘记:

1、使用流式 API

使用流式 API,通过流式 API 优雅地检查重复数据(推荐)

import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class CheckDuplicate {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("A", "B", "C", "A");

        // 找到重复元素
        Set<String> duplicates = list.stream()
                .filter(item -> list.stream().filter(item::equals).count() > 1)
                .collect(Collectors.toSet());

        System.out.println("重复元素: " + duplicates);
        System.out.println("是否存在重复数据: " + !duplicates.isEmpty());
    }
}

stream 是一种功能非常强大的方式,可以很便利的使用声明式方法对集合进行处理,不需要显式地操作集合中的元素。它提供了一个更加函数式的编程模型,允许你进行过滤、转换、收集等操作,同时链式调用,提高了代码的可读性和简洁性。

相比下forEach 是集合类的一个方法,用于对集合中的每个元素执行一个操作,通常是遍历操作。并不提供流式的转换或过滤功能,更多是为了逐个访问元素并执行某些操作。forEach 的典型用法是遍历集合,但不适合用于流式的处理,在这里 forEach 需要显式地在内部写逻辑来计算元素的出现情况。

2、使用原生 Set 快速检查

使用原生 Set 快速检查,可以直接使用 HashSet 或 LinkedHashSet 来判断

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

public class CheckDuplicate {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("A", "B", "C", "A");

        Set<String> seen = new HashSet<>();
        boolean hasDuplicate = list.stream().anyMatch(item -> !seen.add(item));

        System.out.println("是否存在重复数据: " + hasDuplicate);
    }
}

!seen.add(item) 会返回:

  • true--重复元素,
  • false--非重复元素,第一次添加

anyMatch会匹配所有的流元素,一旦出现符合条件的重复元素就会自动结束流,仅适合判断是否会有重复元素。

3、使用new HashSet<>(list)

使用new HashSet<>(list),最后判断两个list间size大小判断是否重复

import cn.hutool.core.collection.CollUtil;

import java.util.Arrays;
import java.util.List;
import java.util.Set;

public class CheckDuplicate {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("A", "B", "C", "A");

        // 使用 Hutool 的工具方法创建 HashSet
        Set<String> set = new HashSet<>(list);
        boolean hasDuplicate = set.size() != list.size();

        System.out.println("是否存在重复数据: " + hasDuplicate);
    }
}

比较两个集合size大小就可判断是否存在重复元素,因为Set下的集合是自动去重的,如果存在重复则集合大小会缩减

4、使用CollUtil.countMap()方法

如果有hutool工具,可以使用CollUtil.countMap()方法

import cn.hutool.core.collection.CollUtil;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

public class CheckDuplicate {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("A", "B", "C", "A", "B");

        // 统计每个元素出现的次数
        Map<String, Integer> countMap = CollUtil.countMap(list);
        
        // 打印重复元素
        countMap.forEach((key, value) -> {
            if (value > 1) {
                System.out.println("重复元素: " + key + ",出现次数: " + value);
            }
        });
    }
}

Collutil.countMap()方法不仅可以统计出现的重复的元素,还可以统计出现的频次,返回结果如下:

重复元素: A,出现次数: 2  
重复元素: B,出现次数: 2

相应的还有CollUtil.newHashSet() 去重,CollUtil.getSet()转换Set<>集合去重,以及CollUtil.getCommon()集合交差去重,方法很多有兴趣的伙伴们可以去研究研究。

结语

总得来说java下stream流是非常不错的方式,而且其下有很多filteriteratorfilter(), map(), collect()等操作,便于处理复杂逻辑链路问题

当然,如果仅有一些简单内部处理,直接foreach是最简单高效的方式,避免了流的转换。

到此这篇关于java集合List快速实现重复判断的方法小结的文章就介绍到这了,更多相关java重复判断内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 创建Java线程安全类的七种方法

    创建Java线程安全类的七种方法

    线程安全是指某个方法或某段代码,在多线程中能够正确的执行,不会出现数据不一致或数据污染的情况,我们把这样的程序称之为线程安全的,反之则为非线程安全的,下面这篇文章主要给大家介绍了关于创建Java线程安全类的七种方法,需要的朋友可以参考下
    2022-06-06
  • 史上最全MybatisPlus从入门到精通

    史上最全MybatisPlus从入门到精通

    MyBatis-Plus是MyBatis增强工具,简化开发并提升效率,支持自动映射表名/字段与实体类,提供条件构造器、多种查询方式(等值/范围/模糊/分页等)、主键策略(如雪花算法、UUID)及分页插件配置,实现灵活的数据操作与数据库交互,需要的朋友跟随小编一起看看吧
    2025-08-08
  • 基于GeoTools和SpringBoot的省域驾车最快路线规划方法

    基于GeoTools和SpringBoot的省域驾车最快路线规划方法

    本文探讨基于GeoTools与SpringBoot的省域驾车最快路线规划方法,解决复杂路况与地理因素影响,通过天地图API计算并存储距离数据,展示湖南、新疆、黑龙江等地的路线成果,为交通与经济影响评估提供参考,感兴趣的朋友快来一起学习吧
    2025-07-07
  • IDEA中Maven爆红以及依赖下载失败的最全解决方案

    IDEA中Maven爆红以及依赖下载失败的最全解决方案

    这篇文章主要介绍了IDEA中Maven爆红,依赖下载失败的最全解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • 详解mybatis中的if-else的嵌套使用

    详解mybatis中的if-else的嵌套使用

    本文主要介绍了mybatis中的if-else的嵌套使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Java中常用解析工具jackson及fastjson的使用

    Java中常用解析工具jackson及fastjson的使用

    今天给大家带来的是关于Java解析工具的相关知识,文章围绕着jackson及fastjson的使用展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Java 设计模式原则之迪米特法则详解

    Java 设计模式原则之迪米特法则详解

    这篇文章主要介绍了Java 设计模式原则之迪米特法则详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 解决feign之间文件上传报错:Error converting request body的问题

    解决feign之间文件上传报错:Error converting request body

    这篇文章主要介绍了解决feign之间文件上传报错:Error converting request body的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • SpringBoot war包部署到Tomcat服务器

    SpringBoot war包部署到Tomcat服务器

    这篇文章主要介绍了SpringBoot war包部署到Tomcat服务器,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • 冒泡排序算法原理及JAVA实现代码

    冒泡排序算法原理及JAVA实现代码

    关键字较小的记录好比气泡逐趟上浮,关键字较大的记录好比石块下沉,每趟有一块最大的石块沉底
    2014-01-01

最新评论