Java对象List根据ID去重

Java对象List根据ID去重

  • 一、前言
    • 1. 使用HashSet去重
    • 2. 使用Stream API去重
    • 3. 使用HashMap去重
    • 4. 使用TreeSet去重并保持顺序
    • 5. 使用LinkedHashMap确保插入顺序


一、前言

在Java中处理大数据时,常常会遇到需要去重的情况。假设我们有一个对象数组,其中对象具有一个ID字段,我们希望将ID相同的对象去重,保留一个对象。下面将介绍几种实现这种去重操作的方法,包括使用集合、流(Streams)以及Map数据结构。

1. 使用HashSet去重

HashSet利用哈希表的特性,可以有效地对元素进行去重。此方法的时间复杂度接近O(n)。

import java.util.*;class MyObject {private int id;private String data;public MyObject(int id, String data) {this.id = id;this.data = data;}public int getId() {return id;}// Equals and hashCode should be based on the ID for correct behavior in HashSet@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;MyObject myObject = (MyObject) o;return id == myObject.id;}@Overridepublic int hashCode() {return Objects.hash(id);}@Overridepublic String toString() {return "MyObject{id=" + id + ", data='" + data + "'}";}
}public class Main {public static void main(String[] args) {List<MyObject> list = Arrays.asList(new MyObject(1, "data1"),new MyObject(2, "data2"),new MyObject(1, "data3"),new MyObject(3, "data4"));Set<MyObject> set = new HashSet<>(list);List<MyObject> resultList = new ArrayList<>(set);System.out.println(resultList);}
}

2. 使用Stream API去重

Java 8引入了Stream API,可以通过distinct()方法直接对流中的元素进行去重。

import java.util.*;
import java.util.stream.Collectors;public class Main {public static void main(String[] args) {List<MyObject> list = Arrays.asList(new MyObject(1, "data1"),new MyObject(2, "data2"),new MyObject(1, "data3"),new MyObject(3, "data4"));List<MyObject> resultList = list.stream().filter(distinctByKey(MyObject::getId)).collect(Collectors.toList());System.out.println(resultList);}public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {Map<Object, Boolean> seen = new ConcurrentHashMap<>();return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;}
}

3. 使用HashMap去重

利用HashMap的键值对特性,我们可以通过ID作为键来去重,只保留最后一个出现的对象。

import java.util.*;public class Main {public static void main(String[] args) {List<MyObject> list = Arrays.asList(new MyObject(1, "data1"),new MyObject(2, "data2"),new MyObject(1, "data3"),new MyObject(3, "data4"));Map<Integer, MyObject> map = new HashMap<>();for (MyObject obj : list) {map.put(obj.getId(), obj);}List<MyObject> resultList = new ArrayList<>(map.values());System.out.println(resultList);}
}

4. 使用TreeSet去重并保持顺序

使用TreeSet可以实现去重并按自然顺序或指定顺序(通过Comparator)排序。

import java.util.*;
import java.util.stream.Collectors;public class Main {public static void main(String[] args) {List<MyObject> list = Arrays.asList(new MyObject(1, "data1"),new MyObject(2, "data2"),new MyObject(1, "data3"),new MyObject(3, "data4"));TreeSet<MyObject> set = list.stream().collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparingInt(MyObject::getId))));List<MyObject> resultList = new ArrayList<>(set);System.out.println(resultList);}
}

5. 使用LinkedHashMap确保插入顺序

LinkedHashMap不仅能去重,还能保持插入顺序。

import java.util.*;public class Main {public static void main(String[] args) {List<MyObject> list = Arrays.asList(new MyObject(1, "data1"),new MyObject(2, "data2"),new MyObject(1, "data3"),new MyObject(3, "data4"));Map<Integer, MyObject> map = new LinkedHashMap<>();for (MyObject obj : list) {map.putIfAbsent(obj.getId(), obj);}List<MyObject> resultList = new ArrayList<>(map.values());System.out.println(resultList);}
}

以上是几种不同的方法来实现对象数组中根据ID去重的操作。这些方法各有优劣,具体选择取决于你的实际需求和数据特点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/34651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CloudCompare二次开发目录(C++长期更新版)

目录 一、环境配置二、功能开发 本文由CSDN点云侠原创&#xff0c;原文链接。如果你不是在点云侠的博客中看到该文章&#xff0c;那么此处便是不要脸的爬虫与GPT。 一、环境配置 WIN10系统下VS2019编译CloudCompare2.12.4CloudCompare与PCL数据格式的相互转换 二、功能开发 …

2024年电商618观察:这是最好的时代 这是最坏的时代

内容提要 目前阶段增长势头更强劲的是中小商家&#xff0c;而星图的核心数据还是10万多个品牌。 十九世纪&#xff0c;英国最伟大的作家狄更斯在他的小说《双城记》开篇中写道&#xff1a; 这是最好的时代&#xff0c;这是最坏的时代&#xff1b; 这是智慧的年代&#xff0c;…

游戏工作室的得力助手:探索高效代理IP软件的选择与应用

在数字化浪潮的推动下&#xff0c;游戏产业蓬勃发展&#xff0c;游戏工作室作为这一领域的重要参与者&#xff0c;其运营效率和稳定性成为了影响业务成功的关键因素。而在众多提升运营效率的工具中&#xff0c;代理IP软件凭借其独特的功能和优势&#xff0c;成为了游戏工作室不…

【LeetCode】每日一题:判断子序列

给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcde"的一个子序列&#x…

Softhsm2和Cryptoki的基本操作

0. 测试模块是否正常工作 sudo pkcs11-tool --module /usr/lib/softhsm/libsofthsm2.so --show-info Cryptoki version 2.30 Manufacturer SoftHSM Library Implementation of PKCS11 (ver 2.2) 1. 列出所有槽(Slots) sudo pkcs11-tool --module /usr/lib/soft…

MyBatis(4)MyBatis 如何配置和使用

MyBatis 的配置和使用可以分为几个步骤进行详细解析。请注意&#xff0c;完整的源码分析是非常庞大的工作&#xff0c;这里会给出一个高层次的视图和关键代码演示。 1. MyBatis 配置 配置通常通过 mybatis-config.xml 配置文件进行&#xff0c;这个文件包括了对 MyBatis 行为…

台式扫描电镜工作距离越远观察区越大?

台式扫描电镜&#xff08;Scanning Electron Microscope, SEM&#xff09;是一种高分辨率的显微镜&#xff0c;它利用电子束扫描样品表面&#xff0c;通过样品与电子束相互作用产生的信号来形成图像。这种显微镜广泛应用于材料科学、生物学和医学等领域&#xff0c;以观察样品的…

提示词绕过大模型安全限制

大模型安全绕过策略 简介 本文使用简单的提示词&#xff0c;可以在所有场景中实现针对某开源模型的安全策略绕过。 glm-4-9b-chat 的安全措施还有待完善。 上一代的6b比这一代的9B&#xff0c;要安全&#xff1b;上一代的6B大模型这一招没有用。 正常对话 若在下述正常互动…

html +css 控制文本高度超出变成省略号

.overflow{height: 50px;display: -webkit-box; /* 使用Webkit的弹性盒子模型显示 */-webkit-line-clamp: 2; /* 限制在一个块元素显示的文本的行数 */-webkit-box-orient: vertical; /* 设置或检索伸缩盒对象的子元素的排列方式 */overflow: hidden; /* 隐藏超出容器的内容 */…

经纬恒润EAS.HSM:驱动硬件信息安全

概述 HSM&#xff08;Hardware Security Module&#xff09;硬件安全模块&#xff0c;是一种用于保护和管理强认证系统所使用的密钥&#xff0c;并同时提供相关密码学操作的计算机硬件设备。 HSM 在汽车信息安全中扮演着至关重要的角色。随着汽车智能化和网联化的快速发展&am…

ONLYOFFICE8.1版本震撼来袭

目录 软件简介 产品概述&#xff1a; 功能特点&#xff1a; 技术原理&#xff1a; 版本与部署&#xff1a; 8.1版本更新 全新的PDF编辑器 1.文本编辑 2.页面处理 &#xff08;添加、旋转、删除&#xff09; 3.插入和调整各种对象&#xff0c;例如表格、形状、文本框、…

MYSQL十、MYSQL的存储过程和触发器的基本认识

存储过程 存储过程&#xff1a;存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合。调用存储过程可以简化应用开发人员的很多工作&#xff0c;减少数据在数据库和应用服务器之间的传输&#xff0c;对于提高数据处理的效率是有好处的。 存储过程思想上很简单&#xff…

【学习笔记】数据结构(三)

栈和队列 文章目录 栈和队列3.1 栈 - Stack3.1.1 抽象数据类型栈的定义3.1.2 栈的表示和实现 3.2 栈的应用举例3.2.1 数制转换3.2.2 括号匹配的检验3.2.3 迷宫求解3.2.4 表达式求值 - 波兰、逆波兰3.2.5 反转一个字符串或者反转一个链表 3.3 栈与递归的实现3.4 队列 - Queue3.4…

Swift Combine — Scheduler(subscribe(on:)和receive(on:)的使用)

在 Swift 的 Combine 框架中&#xff0c;Scheduler 是一个重要的概念&#xff0c;用于控制任务的调度和执行。本文将详细介绍 Scheduler 的作用、常见的 Scheduler 类型以及如何使用 Scheduler 来管理任务的执行。 Scheduler 的定义 Scheduler 用于管理任务的调度和执行&…

Cell2Sentence:为LLM传输生物语言

像GPT这样的LLM在自然语言任务上表现出了令人印象深刻的性能。这里介绍一种新的方法&#xff0c;通过将基因表达数据表示为文本&#xff0c;让这些预训练的模型直接适应生物背景&#xff0c;特别是单细胞转录组学。具体来说&#xff0c;Cell2Sentence将每个细胞的基因表达谱转换…

AI学习指南机器学习篇-朴素贝叶斯模型应用与Python实践

AI学习指南机器学习篇-朴素贝叶斯模型应用与Python实践 在本篇博客中&#xff0c;我们将会介绍如何使用Python中的Scikit-learn库来实现朴素贝叶斯模型。朴素贝叶斯是一种常见的机器学习算法&#xff0c;它在文本分类、垃圾邮件检测等领域有着广泛的应用。通过本文的学习&…

小学数学蝴蝶模型详解

蝴蝶模型 1.蝴蝶模型仅存在于梯形中&#xff0c;是连接梯形两条对角线而形成的&#xff0c;如下图&#xff1a; 2.蝴蝶模型有几条公式 (1) (2) S△AODS△BOC 等等......

commons-pool2 对象池技术

对象池&#xff1f; 让任意对象实现池功能&#xff0c;只要结合使用两个类GenericObjectPool 和PooledObjectFactory &#xff0c;这个池子可以实现: &#xff08;1&#xff09;minIdle个数保证&#xff1a;通过配置&#xff0c;测试并清除池子中的空闲对象&#xff0c;以保证…

多商户零售外卖超市外卖商品系统源码

构建你的数字化零售王国 一、引言&#xff1a;数字化零售的崛起 在数字化浪潮的推动下&#xff0c;零售业务正经历着前所未有的变革。多商户零售外卖超市商品系统源码应运而生&#xff0c;为商户们提供了一个全新的数字化零售解决方案。通过该系统源码&#xff0c;商户们可以…

BFS:解决拓扑排序问题

文章目录 什么是拓扑排序&#xff1f;关于拓扑排序的题1.课程表2.课程表Ⅱ3.火星词典 总结 什么是拓扑排序&#xff1f; 要知道什么拓扑排序我们首先要知道什么是有向无环图&#xff0c;有向无环图我们看名字其实就很容易理解&#xff0c;有向就是有方向&#xff0c;无环就是没…