【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…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
