【Java】List集合去重的方式
List集合去重的方式
- 方式一:利用TreeSet集合特性排序+去重(有序)
- 方式二:利用HashSet的特性去重(无序)
- 方式三:利用LinkedHashSet去重(有序)
- 方式四:迭代器去重(无序)
- 方式五:使用list.contains()对全部元素进行判断(有序)
- 方式六:使用Java8特性(Stream去重)去重(有序)
- 方式七:使用list自身方法remove()–>不推荐
- 总结:
方式一:利用TreeSet集合特性排序+去重(有序)
TreeSet可以将字符串类型的数据按照字典顺序进行排序,首字母相同则看第二位
public static void main(String[] args) {// 一.利用TreeSet集合特性排序+去重List<String> list=new LinkedList<>();list.add("22");list.add("11");list.add("33");list.add("66");list.add("22");list.forEach(item->{System.out.println("去重前的集合:"+item);});System.out.println("-----------------");List<String> result=new LinkedList<>(new TreeSet<>(list));System.out.println("去重后的集合:"+result);}
去重前的集合元素:22
去重前的集合元素:11
去重前的集合元素:33
去重前的集合元素:66
去重前的集合元素:22
去重后的集合:[11, 22, 33, 66]
方式二:利用HashSet的特性去重(无序)
由于Set的特性是无序且不可重复,我们利用这个特性进行两步操作:
- 把list放入set中
- 把set还回list里
public static void main(String[] args) {// 利用set的特性去重List<String> list=new LinkedList<>();list.add("22");list.add("11");list.add("33");list.add("66");list.add("22");Iterator iter=list.iterator();while(iter.hasNext()){System.out.println("去重前的集合元素:"+iter.next());}System.out.println("-----------------");// result集合存放最终的结果List<String> result=new LinkedList<>();if (list.size()>0&&list!=null){// 新建HashSet集合,将list放入Set<String> set=new HashSet<>();set.addAll(list);// 将去重后的set集合放入结果集合result中result.addAll(set);}System.out.println("去重后的集合:"+result);}
去重前的集合元素:22
去重前的集合元素:11
去重前的集合元素:33
去重前的集合元素:66
去重前的集合元素:22
去重后的集合:[22, 11, 33, 66]
方式三:利用LinkedHashSet去重(有序)
LinkedHashSet虽然可以去重,但是根据它的特性,它不能对数据进行排序,只能维持原来插入时的秩序
public static void main(String[] args) {// 利用LinkedHashSet集合去重List<String> list=new LinkedList<>();list.add("22");list.add("11");list.add("33");list.add("66");list.add("22");for (int i=0;i<list.size();i++){System.out.println("去重前的集合元素:"+list.get(i));}System.out.println("-----------------");List<String> result=new LinkedList<>(new LinkedHashSet<String>(list));System.out.println("去重后的集合:"+result);}
去重前的集合元素:22
去重前的集合元素:11
去重前的集合元素:33
去重前的集合元素:66
去重前的集合元素:22
去重后的集合:[22, 11, 33, 66]
方式四:迭代器去重(无序)
此方法得到的新集合是无序的,也就是新集合的排列顺序和原集合不一致
public static void main(String[] args) {// 二.迭代器去重(无序)List<String> list=new LinkedList<>();list.add("22");list.add("11");list.add("33");list.add("66");list.add("22");for (String item:list){System.out.println("去重前的集合元素:"+item);}System.out.println("-----------------");Iterator<String> iterator=list.iterator();while (iterator.hasNext()){String next= iterator.next();// 如果存在两个相同的值if (list.indexOf(next)!=list.lastIndexOf(next)){//移除最后那个相同的值iterator.remove();}}System.out.println("去重后的集合:"+list);}
去重前的集合元素:22
去重前的集合元素:11
去重前的集合元素:33
去重前的集合元素:66
去重前的集合元素:22
去重后的集合:[11, 33, 66, 22]
方式五:使用list.contains()对全部元素进行判断(有序)
- String类型会判断字符串里是否有相同的部分
- List里则会判断是否有相同的元素
- 我们可以用list.contains()的方法进行判断,然后将其添加到新的list当中,元素的顺序不发生改变
public static void main(String[] args) {// 使用list.contains()对全部元素进行判断System.out.println("----------");System.out.println("探究contains()方法");String s1="aaa";String s2="aa";System.out.println(s1.contains(s2));List<String> list0=new LinkedList<>();list0.add("aaa");System.out.println(list0.contains("aa"));System.out.println("----------");List<String> list=new LinkedList<>();list.add("22");list.add("11");list.add("33");list.add("66");list.add("22");System.out.println("去重前的集合:"+list);System.out.println("-----------------");List<String> result=new LinkedList<>();for (String str:list){if (!result.contains(str)){result.add(str);}}System.out.println("去重后的集合:"+result);}
探究contains()方法
true
false
去重前的集合:[22, 11, 33, 66, 22]
去重后的集合:[22, 11, 33, 66]
方式六:使用Java8特性(Stream去重)去重(有序)
把list集合->Stream流,然后对流用distinct()去重,再用collect()收集
public static void main(String[] args) {// 使用Java8特性去重List<String> list=new LinkedList<>();list.add("22");list.add("11");list.add("33");list.add("66");list.add("22");System.out.println("去重前的集合:"+list);System.out.println("-----------------");List<String> result=new LinkedList<>();result=list.stream().distinct().collect(Collectors.toList());System.out.println("去重后的集合:"+result);}
去重前的集合:[22, 11, 33, 66, 22]
去重后的结集合:[22, 11, 33, 66]
方式七:使用list自身方法remove()–>不推荐
- 如果你的list里存的比较复杂,是一个List<Map<String,Object>>格式的情况,最无奈之举就是这种方法
- 主要操作是将同一个list用两层for循环配合.equals()方法,有相同的就用remove()方法剔除掉,然后得到一个没有重复数据的list
public static List<Map<String,Object>> distinct(List<Map<String,Object>> list){if (list!=null && list.size()>0){for (int i=0;i<list.size();i++){for (int j=list.size()-1;j>i;j--){// 这里是对象的比较,如果去重条件不一样,修改这里即可if (list.get(j).equals(list.get(i))){list.remove(j);}}}}return list;}
总结:
介绍集合去重的方法中实现最简洁,且去重之后的顺序能和原集合保持一致的实现方法,只有两种:LinkedHashSet 去重和 Stream 去重,其中后一种去重方法无需借助新集合,是我们优先考虑的去重方法
相关文章:
【Java】List集合去重的方式
List集合去重的方式方式一:利用TreeSet集合特性排序去重(有序)方式二:利用HashSet的特性去重(无序)方式三:利用LinkedHashSet去重(有序)方式四:迭代器去重&am…...
每个人都应该知道的5个NLP代码库
在本文中,将详细介绍目前常用的Python NLP库。内容译自网络。这些软件包可处理多种NLP任务,例如词性(POS)标注,依存分析,文档分类,主题建模等等。NLP库的基本目标是简化文本预处理。目前有许多工…...

SPI协议介绍
SPI协议介绍 文章目录SPI协议介绍一、 SPI硬件知识1.1 硬件连线1.2 SPI控制器内部结构二、 SPI协议2.1 传输示例2.2 SPI模式致谢一、 SPI硬件知识 1.1 硬件连线 引脚含义如下: 引脚含义DO(MOSI)Master Output, Slave Input,SPI主控用来发出数据&#x…...
MySQL数据库中索引的优点及缺点
一、索引的优点 1)创建索引可以大幅提高系统性能,帮助用户提高查询的速度; 2)通过索引的唯一性,可以保证数据库表中的每一行数据的唯一性; 3)可以加速表与表之间的链接; 4&#…...
(q)sort函数总结(基础篇)
1.sort函数 介绍:这是一个C的函数,包含于algorithm头文件中。 基本格式: sort(起始地址(常为变量名),排序终止的地址(变量名加上排序长度),自定义的比较函数) 重点&a…...

【数据库】MongoDB数据库详解
目录 一,数据库管理系统 1, 什么是数据库 2,什么是数据库管理系统 二, NoSQL 是什么 1,NoSQL 简介 2,NoSQL数据库 3,NoSQL 与 RDBMS 对比 三,MongoDB简介 1, MongoDB 是什…...

【linux】进程间通信——system V
system V一、system V介绍二 、共享内存2.1 共享内存的原理2.2 共享内存接口2.2.1 创建共享内存shmget2.2.2 查看IPC资源2.2.3 共享内存的控制shmctl2.2.4 共享内存的关联shmat2.2.5 共享内存的去关联shmdt2.3 进程间通信2.4 共享内存的特性2.5 共享内存的大小三、消息队列3.1 …...
计算机网络的基本组成
计算机网络是由多个计算机、服务器、网络设备(如路由器、交换机、集线器等)通过各种通信线路(如有线、无线、光纤等)和协议(如TCP/IP、HTTP、FTP等)互相连接组成的复杂系统,它们能够在物理层、数…...

【数据结构趣味多】Map和Set
1.概念及场景 Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。 在此之前,我还接触过直接查询O(N)和二分查询O(logN),这两个查询有很多不足之出,直接查询的速率太低,而二分查…...

Redis 之企业级解决方案
文章目录一、缓存预热二、缓存雪崩三、缓存击穿四、缓存穿透五、性能指标监控5.1 监控指标5.2 监控方式🍌benchmark🍌monitor🍌slowlog提示:以下是本篇文章正文内容,Redis系列学习将会持续更新 一、缓存预热 1.1 现象…...

雷达实战之射频前端配置说明
在无线通信领域,射频系统主要分为射频前端,以及基带。从发射通路来看,基带完成语音等原始信息通过AD转化等手段转化成基带信号,然后经过调制生成包含跟多有效信息,且适合信道传输的信号,最后通过射频前端将信号发射出去…...
Android SDK删除内置的触宝输入法
问题 Android 8.1.0, 展锐平台。 过CTA认证,内置的触宝输入法会连接网络,且默认就获取到访问网络的权限,没有弹请求窗口访问用户,会导致过不了认证。 预置应用触宝输入法Go版连网未明示(开启后࿰…...
[202002][Spring 实战][第5版][张卫滨][译]
[202002][Spring 实战][第5版][张卫滨][译] habuma/spring-in-action-5-samples: Home for example code from Spring in Action 5. https://github.com/habuma/spring-in-action-5-samples 第 1 部分 Spring 基础 第 1 章 Spring 起步 1.1 什么是 Spring 1.2 初始化 Spr…...

H5视频上传与播放
背景 需求场景: 后台管理系统: (1)配置中支持上传视频、上传成功后封面缩略图展示,点击后自动播放视频; (2)配置中支持上传多个文件; 前台系统: &#…...

通过OpenAI来做机械智能故障诊断-测试(1)
通过OpenAI来做机械智能故障诊断 1. 注册使用2. 使用案例1-介绍故障诊断流程2.1 对话内容2.2 对话小结3. 使用案例2-写一段轴承故障诊断的代码3.1 对话内容3.2 对话小结4. 对话加载Paderborn轴承故障数据集并划分4.1 加载轴承故障数据集并划分第一次测试4.2 第二次加载数据集自…...

ASE40N50SH-ASEMI高压MOS管ASE40N50SH
编辑-Z ASE40N50SH在TO-247封装里的静态漏极源导通电阻(RDS(ON))为100mΩ,是一款N沟道高压MOS管。ASE40N50SH的最大脉冲正向电流ISM为160A,零栅极电压漏极电流(IDSS)为1uA,其工作时耐温度范围为-55~150摄氏度。ASE40N…...
MySQL基础命令大全——新手必看
Mysql 是一个流行的开源关系型数据库管理系统,广泛用于各种 Web 应用程序和服务器环境中。Mysql 有很多命令可以使用,以下是 Mysql 基础命令: 1、连接到Mysql服务器: mysql -h hostname -u username -p 其中,"ho…...

sklearn学习-朴素贝叶斯(二)
文章目录一、概率类模型的评估指标1、布里尔分数Brier Score对数似然函数Log Loss二、calibration_curve:校准可靠性曲线三、多项式朴素贝叶斯以及其变化四、伯努利朴素贝叶斯五、改进多项式朴素贝叶斯:补集朴素贝叶斯ComplementNB六、文本分类案例TF-ID…...

MySQL_主从复制读写分离
主从复制 概述 主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。 MySQL支持一台主库同时向多台从库进行复制,从…...

shell基础学习
文章目录查看shell解释器写hello world多命令处理执行变量常用系统变量自定义变量撤销变量静态变量变量提升为全局环境变量特殊变量$n$#$* $$?运算符:条件判断比较流程控制语句ifcasefor 循环while 循环read读取控制台输入基本语法:函数系统函数basenamedirname自定义函数shel…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...