JAVA实体类集合该如何去重?
JAVA实体类集合该如何去重?
最近在工作中经常遇到需要去重的需求,所以特意系统的来梳理一下
有目录,不迷路
- JAVA实体类集合该如何去重?
- 单元素去重
- 方法一:利用Set去重
- 方法二:利用java 8的stream写法,方便优雅快捷高效
- 实体类对象去重
- 单属性去重
- 方法一:利用map去重
- 方法二:利用map去重,java 8语法
- 方法三:利用Set去重
- 方法四: 利用Set去重,java 8写法
- 方法五:定义过滤器
- 补充
- 多属性去重
- 方法一:利用map根据姓名、年龄去重
- 方法二:利用map根据姓名、年龄去重,java 8写法
- 方法三:利用Set根据姓名、年龄去重,java 8写法
- 重写equals()和hashCode()方法
- 方法四:利用java 8 的distinct(),最推荐
- 方法五:通过contains()方法来调用equals()方法来对比
- 方法六:重写方法后,通过Set去重
单元素去重
方法一:利用Set去重
public static void main(String[] args) {// 生成含重复元素的集合并打印List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(2);list.add(3);System.out.println("去重前:" + list);// 利用HashSet去重后并打印HashSet<Integer> hashSet = new HashSet<>(list);list.clear();list.addAll(hashSet);System.out.println("去重后:" + list);}
执行:

方法二:利用java 8的stream写法,方便优雅快捷高效
public static void main(String[] args) {// 生成含重复元素的集合并打印List<Integer> list = new ArrayList<>();list.add(2);list.add(3);list.add(3);list.add(4);System.out.println("去重前:" + list);// 利用java 8的stream写法list = list.stream().distinct().collect(Collectors.toList());System.out.println("去重后:" + list);}
执行:

实体类对象去重
先新建实体类:
/*** @Author: guqueyue* @Description: 学生类* @Date: 2023/12/12**/
public class Student {/** 姓名 */private String name;/** 年龄 */private Integer age;public Student() {}public Student(String name, Integer age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}
单属性去重
方法一:利用map去重
public static void main(String[] args) {// 生成学生集合List<Student> studentList = new ArrayList<>();studentList.add(new Student("张三", 18));studentList.add(new Student("张三", 19));studentList.add(new Student("张三", 22));studentList.add(new Student("李四", 18));System.out.println("去重前: " + studentList);// 利用map根据姓名去重Map<String, Student> map = new HashMap<>();for (Student student : studentList) {map.put(student.getName(), student);}studentList = new ArrayList<>(map.values());System.out.println("去重后: " + studentList);}
执行得:

方法二:利用map去重,java 8语法
比方法一代码看似简洁了,但实际上好似更加复杂了
public static void main(String[] args) {// 生成学生集合List<Student> studentList = new ArrayList<>();studentList.add(new Student("张三", 18));studentList.add(new Student("张三", 19));studentList.add(new Student("张三", 18));studentList.add(new Student("李四", 18));System.out.println("去重前: " + studentList);// 利用map根据姓名去重,java 8语法studentList = studentList.stream().collect(Collectors.toMap(student -> student.getName(), Function.identity(), (o, n) -> n)).values().stream().collect(Collectors.toList());System.out.println("去重后: " + studentList);}
执行:

方法三:利用Set去重
public static void main(String[] args) {// 生成学生集合List<Student> studentList = new ArrayList<>();studentList.add(new Student("张三", 18));studentList.add(new Student("张三", 19));studentList.add(new Student("张三", 18));studentList.add(new Student("李四", 18));System.out.println("去重前: " + studentList);// 利用Set去重
// Set<Student> set = new TreeSet<>(((o1, o2) -> o1.getName().compareTo(o2.getName())));Set<Student> set = new TreeSet<>((Comparator.comparing(Student::getName)));set.addAll(studentList);studentList.clear();studentList = new ArrayList<>(set);System.out.println("去重后: " + studentList);}
执行:

方法四: 利用Set去重,java 8写法
public static void main(String[] args) {// 生成学生集合List<Student> studentList = new ArrayList<>();studentList.add(new Student("张三", 18));studentList.add(new Student("张三", 19));studentList.add(new Student("张三", 18));studentList.add(new Student("李四", 18));System.out.println("去重前: " + studentList);// 利用Set去重,java 8写法studentList = studentList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Student::getName))),ArrayList::new));System.out.println("去重后: " + studentList);}
执行:

方法五:定义过滤器
public static void main(String[] args) {// 生成学生集合List<Student> studentList = new ArrayList<>();studentList.add(new Student("张三", 18));studentList.add(new Student("张三", 19));studentList.add(new Student("张三", 18));studentList.add(new Student("李四", 18));System.out.println("去重前: " + studentList);// 定义过滤器studentList = studentList.stream().filter(distinctKey(Student::getName)).collect(Collectors.toList());System.out.println("去重后: " + studentList);}/*** @Description 自定义过滤器* @Param [keyExtractor]* @return java.util.function.Predicate<T>**/public static <T> Predicate<T> distinctKey(Function<? super T, Object> keyExtractor) {Map<Object, Boolean> map = new ConcurrentHashMap<>();return o -> map.putIfAbsent(keyExtractor.apply(o), Boolean.TRUE) == null;}
执行:

补充
补充一点,如何提取去重后的单元素集合:
public static void main(String[] args) {// 生成学生集合List<Student> studentList = new ArrayList<>();studentList.add(new Student("张三", 18));studentList.add(new Student("张三", 19));studentList.add(new Student("张三", 18));studentList.add(new Student("李四", 18));System.out.println("去重前: " + studentList);// 提取去重后的姓名List<String> nameList = studentList.stream().map(Student::getName).distinct().collect(Collectors.toList());System.out.println("去重后: " + nameList);}
执行:

多属性去重
方法一:利用map根据姓名、年龄去重
public static void main(String[] args) {// 生成学生集合List<Student> studentList = new ArrayList<>();studentList.add(new Student("张三", 18));studentList.add(new Student("张三", 19));studentList.add(new Student("张三", 18));studentList.add(new Student("李四", 18));System.out.println("去重前: " + studentList);// 利用map根据姓名、年龄去重Map<String, Student> map = new HashMap<>();for (Student student : studentList) {map.put(student.getName() + "_" + student.getAge(), student);}studentList = new ArrayList<>(map.values());System.out.println("去重后: " + studentList);}
执行:

方法二:利用map根据姓名、年龄去重,java 8写法
public static void main(String[] args) {// 生成学生集合List<Student> studentList = new ArrayList<>();studentList.add(new Student("张三", 18));studentList.add(new Student("张三", 19));studentList.add(new Student("张三", 18));studentList.add(new Student("李四", 18));System.out.println("去重前: " + studentList);// 利用map根据姓名、年龄去重,java 8写法studentList = studentList.stream().collect(Collectors.toMap(s -> s.getName() + "_" + s.getAge(), Function.identity(), (o, n) -> n)).values().stream().collect(Collectors.toList());System.out.println("去重后: " + studentList);}
执行:

方法三:利用Set根据姓名、年龄去重,java 8写法
public static void main(String[] args) {// 生成学生集合List<Student> studentList = new ArrayList<>();studentList.add(new Student("张三", 18));studentList.add(new Student("张三", 19));studentList.add(new Student("张三", 18));studentList.add(new Student("李四", 18));System.out.println("去重前: " + studentList);// 利用Set根据姓名、年龄去重,java 8写法studentList = studentList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getName() + "_" + o.getAge()))), ArrayList::new));System.out.println("去重后: " + studentList);}
执行:

重写equals()和hashCode()方法
下面的几种方法首先需要在实体类中重写equals()和hashCode()方法
@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return Objects.equals(name, student.name) && Objects.equals(age, student.age);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
方法四:利用java 8 的distinct(),最推荐
public static void main(String[] args) {// 生成学生集合List<Student> studentList = new ArrayList<>();studentList.add(new Student("张三", 18));studentList.add(new Student("张三", 19));studentList.add(new Student("张三", 18));studentList.add(new Student("李四", 18));System.out.println("去重前: " + studentList);// 利用java 8 的distinct(),根据姓名和年龄去重studentList = studentList.stream().distinct().collect(Collectors.toList());System.out.println("去重后: " + studentList);}
执行:

方法五:通过contains()方法来调用equals()方法来对比
public static void main(String[] args) {// 生成学生集合List<Student> studentList = new ArrayList<>();studentList.add(new Student("张三", 18));studentList.add(new Student("张三", 19));studentList.add(new Student("张三", 18));studentList.add(new Student("李四", 18));System.out.println("去重前: " + studentList);// 通过contains()方法来调用equals()方法来对比,根据姓名和年龄去重List<Student> newStudentList = new ArrayList<>();for (Student student : studentList) {if (!newStudentList.contains(student)) {newStudentList.add(student);}}System.out.println("去重后: " + newStudentList);}
执行:

方法六:重写方法后,通过Set去重
public static void main(String[] args) {// 生成学生集合List<Student> studentList = new ArrayList<>();studentList.add(new Student("张三", 18));studentList.add(new Student("张三", 19));studentList.add(new Student("张三", 18));studentList.add(new Student("李四", 18));System.out.println("去重前: " + studentList);// 通过Set,根据姓名和年龄去重Set<Student> set = new HashSet<>(studentList);studentList.clear();studentList.addAll(set);System.out.println("去重后: " + studentList);}
执行:

完结撒花!!!

相关文章:
JAVA实体类集合该如何去重?
JAVA实体类集合该如何去重? 最近在工作中经常遇到需要去重的需求,所以特意系统的来梳理一下 有目录,不迷路 JAVA实体类集合该如何去重?单元素去重方法一:利用Set去重方法二:利用java 8的stream写法…...
修改Element UI可清空Input的样式
如图所示,修改Input右侧的清空按钮位置: <el-input class"create-catalog-ipt"placeholder"请输入相关章节标题"v-model"currentCatalogTitle"clearable /> // SCSS环境 ::v-deep {.create-catalog-ipt {input {he…...
Java常用注解
文章目录 第一章、Java注解与元数据1.1)元数据与注解概念介绍1.2)Java注解的作用和使用1.3)注解的分类 第二章、Mybatis框架常用注解2.1)Mybatis注解概览2.2)常用注解MapperScanMapperSelectInsertUpdateDeleteParam结…...
golang实现同步阻塞、同步非阻塞、异步非阻塞IO模型
一、同步阻塞IO模型TCP和HTTP示例 同步阻塞IO符合我们的直觉认知,应用程序从TCP连接接收数据缓冲区接受数据,如果没有数据就等待——此处就是阻塞,如果有数据需要把数据从内核空间读取到用户空间——此处就是同步。 在Go语言中进行同步阻塞IO编程TCP交互,可以使用标准库中…...
java SSM教师工作量管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计
一、源码特点 java SSM 教师工作量管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要…...
大数据技术之Hive(超级详细)
第1章 Hive入门 1.1 什么是Hive Hive:由Facebook开源用于解决海量结构化日志的数据统计。 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。 本质是:将HQL转化成MapReduce程序 …...
NVMe over Fabrics with SPDK with iRDMA总结 - 1
1.0 Introduction简介 NVM Express* (NVMe*) drives are high-speed, low-latency, solid-state drives (SSDs), that connect over the server Peripheral Component Interconnect Express* (PCIe*) bus. NVM Express* (NVMe*) 硬盘是高速、低延迟的固态硬盘 (SSD),通过服…...
【PTA刷题】求链式线性表的倒数第K项(代码+详解)
文章目录 题目代码详解 题目 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。 输入格式: 输入首先给出一个正整数K,随后是若干非负整数,最后以一个负整数表示结尾(该负数不算在序列内&#…...
VSCode 创建工作区,多文件夹终端切换
VSCode 创建工作区的好处有以下几点: 项目结构清晰:每个工作区都有自己的文件夹结构,可以更好地组织和管理项目文件。版本控制:VSCode 支持多种版本控制系统,如Git,可以在工作区内进行代码的版本管理。插件…...
高阶函数(js的问题)
(1)函数可以作为参数被传递 (2)函数可以作为返回值输出 4-1.函数作为参数传递 Array.prototype.sort方法: var array [10,5,12,3];array.sort();//array:[10,12,3,5]//如代码那样,排序的结果并不是我们想要…...
android-android源码目录
android源码目录 Android.bp art bionic bootable bootstrap.bash build build.sh compatibility cts dalvik developers development device external frameworks: Android 系统的核心框架代码av: 该目录包含与音视频相关的框架和库,如音频解码器、视频编码器、多…...
Json格式化
Json格式化 大家好,我是微赚淘客机器人的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! Json格式化:让数据更亮眼,解密Json的奇妙世界 在现代Web开发中,Json(JavaScript Object N…...
数据可视化设计:让数据故事更有说服力
写在开头 在数字化的时代,数据如同一把锁住的宝剑,等待我们挥舞。然而,唯有通过巧妙运用数据可视化的原则和技术,我们才能真正解锁数据的力量,创造出令人信服的数据故事。本文将深入研究数据可视化设计的奥秘,揭示其中的魔法,让你在数据的海洋中游刃有余,用数据的语言…...
java面试题-Spring事务以及@Transactional注解详解
远离八股文,面试大白话,通俗且易懂 看完后试着用自己的话复述出来。有问题请指出,有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来,大家一起解决。 java面试题汇总-目录-持续更新中 对于这个面试中高频问到…...
ARM流水灯
.text .global _start _start: LED1 1.RCC时钟使能GPIOE RCC_MP_AHB4ENSETR[4]->1 LDR R0,0x50000a28 LDR R1,[R0] ORR R1,R1,#(0x1<<4) STR R1,[R0] 2.设置PE10为输出模式 GPIOE_MODER[21:20]->01 先清0 LDR R0,0x50006000 LDR R1,[R0] BIC R1,R1,#(0x3<&…...
docker-compose单机容器编排
Dockerfile:先配置好文件,然后build,镜像-------->容器。 docker-conpose 既可以基于dockerfile,也可以基于镜像,一键式拉起镜像和容器。 docker-compose核心就是yml文件,可以定义容器的一切。通过yml配置,直接运行…...
matlab信号分选系统算法-完整算法结构
matlab信号分选系统算法 针对得到的脉冲流PDW进行信号分选,包括重频恒定、重频抖动、重频参差和重频滑变四种脉间调制类型。 这里我们先进行数据的仿真,后续边仿真边分享思路:首先根据信号类型,分别产生重频恒定、重频抖动、重…...
十八)Stable Diffusion使用教程:艺术二维码案例
今天说说怎么样使用SD生成艺术二维码。 我们直接上图。 方式有三种,分别如下: 1)方式一:直接 contronet 的tile模型进行控制 使用QRBTF Classic生成你的二维码。 首先输入网址,选择喜欢的二维码样式(推荐第一种就行): 然后选择相应参数,这里推荐最大的容错率,定…...
【LeetCode每日一题】53. 最大子数组和
https://leetcode.cn/problems/maximum-subarray/description/ 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 方式一:暴力…...
机器学习笔记 什么是协方差矩阵?
一、协方差矩阵 协方差矩阵是一种矩阵,用于表示随机向量中给定的元素对之间的协方差值。协方差矩阵也可以称为色散矩阵或方差-协方差矩阵。这是因为每个元素的方差是沿着矩阵的主对角线表示的。 协方差矩阵始终是方阵。此外,它是半正定且对称的。该矩阵在随机建模和主成分分析…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
