【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…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...