【精品】集合list去重

news/发布时间2024/9/20 8:52:52

示例一:对于简单类型,比如String

    public static void main(String[] args) {List<String> list = new ArrayList< >();list.add("aaa");list.add("bbb");list.add("bbb");list.add("ccc");list.add("abc");list.add("abc");list.add("abd");list.add("cba");list.add("cba");for (String s : list) {System.out.print(s+"\t");}System.out.println("\n-----------------");//方法一:利用Set去重Set<String> set = new HashSet< >();set.addAll(list);for (String s : set) {System.out.print(s+"\t");}System.out.println("\n-----------------");//方法二:利用TreeSet集合特性排序+去重:TreeSet可以将字符串类型的数据按照字典顺序进行排序,首字母相同则看第二位List<String> list2 = new ArrayList<>(new TreeSet<>(list));for (String s : list2) {System.out.print(s+"\t");}System.out.println("\n-----------------");//方法三:LinkedHashSet虽然可以去重,但是根据他的特性,他不能对数据进行排序,只能维持原来插入时的秩序List<String> list3 = new ArrayList<>(new LinkedHashSet<>(list));for (String s : list3) {System.out.print(s+"\t");}System.out.println("\n-----------------");//方法四:用list.contains()的方法进行判断,然后将其添加到新的list当中,元素的顺序不发生改变List<String> list4 = new ArrayList<>();for (String item : list) {if (!list4.contains(item)) {list4.add(item);}}for (String s : list4) {System.out.print(s+"\t");}System.out.println("\n-----------------");//方法五:使用Java8特性去重:把list集合->Stream流,然后对流用distinct()去重,再用collect()收集List<String> list5 = list.stream().distinct().collect(Collectors.toList());for (String s : list5) {System.out.print(s+"\t");}System.out.println("\n-----------------");//方法六:使用list自身方法remove():将同一个list用两层for循环配合.equals()方法,有相同的就用remove()方法剔除掉,然后得到一个没有重复数据的listfor (int i = 0; i < list.size()-1; i++) {for (int j = list.size()-1; j >i; j--) {if(list.get(i).equals(list.get(j))){list.remove(j);}}}for (String s : list) {System.out.print(s+"\t");}}

结果:
在这里插入图片描述

示例二:对于复杂类型,根据指定属性去重

测试代码:

public static void main(String[] args) {List<Dept> depts = new ArrayList<>();depts.add(new Dept(10, "ACCOUNTING", "NEWYORK"));depts.add(new Dept(20, "RESEARCH", "DALLAS"));depts.add(new Dept(20, "RESEARCH", "DALLAS"));depts.add(new Dept(30, "SALES", "CHICAGO"));depts.add(new Dept(30, "SALES", "CHICAGO"));depts.add(new Dept(30, "OPERATIONS", "BOSTON"));//方法一:List<Dept> res = depts.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Dept::getDeptno))), ArrayList::new));res.forEach(System.out::println);//方法二:List<Integer> deptnoList = new ArrayList<>();List<Dept> res2 = depts.stream().filter(item -> {boolean flag = !deptnoList.contains(item.getDeptno());deptnoList.add(item.getDeptno());return flag;}).collect(Collectors.toList());res2.forEach(System.out::println);}

结果:

在这里插入图片描述

示例三:对于复杂类型,根据指定属性去重(建议✨✨✨✨✨)

public class DemoTest {public static void main(String[] args) {List<Dept> depts = new ArrayList<>();depts.add(new Dept(10, "ACCOUNTING", "NEWYORK"));depts.add(new Dept(20, "RESEARCH", "DALLAS"));depts.add(new Dept(20, "RESEARCH", "DALLAS"));depts.add(new Dept(30, "SALES", "CHICAGO"));depts.add(new Dept(30, "SALES", "CHICAGO"));depts.add(new Dept(30, "OPERATIONS", "BOSTON"));//filter参数为true则保留depts.stream().filter(distinctByKey(Dept::getDeptno)).forEach(System.out::println);}private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {Map<Object,Boolean> seen = new ConcurrentHashMap<>();//putIfAbsent方法添加键值对,如果map集合中没有该key对应的值,则直接添加,并返回null,如果已经存在对应的值,则依旧为原来的值。//如果返回null表示添加数据成功(不重复),不重复(null==null :TRUE)return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;}}

结果:
在这里插入图片描述

示例四:对于复杂类型,根据指定属性去重

    public static void main(String[] args) {List<Dept> depts = new ArrayList<>();depts.add(new Dept(10, "ACCOUNTING", "NEWYORK"));depts.add(new Dept(20, "RESEARCH", "DALLAS"));depts.add(new Dept(20, "RESEARCH", "DALLAS"));depts.add(new Dept(30, "SALES", "CHICAGO"));depts.add(new Dept(30, "SALES", "CHICAGO"));depts.add(new Dept(30, "OPERATIONS", "BOSTON"));final List<Dept> res = depts.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Dept::getDeptno))), ArrayList::new));res.forEach(System.out::println);}

结果:
在这里插入图片描述

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

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

相关文章

数据之光:探索数据库技术的演进之路

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

09-Java组合模式 ( Composite Pattern )

Java组合模式 摘要实现范例 组合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象 组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次 组合模式创建了一个包含自己对象组…

Mac 重新安装系统

Mac 重新安装系统 使用可引导安装器重新安装&#xff08;可用于安装非最新的 Mac OS&#xff0c;系统降级&#xff0c;需要清除所有数据&#xff09; 插入制作好的可引导安装器&#xff08;U盘或者移动固态硬盘&#xff09;&#xff0c;如何制作可引导安装器将 Mac 关机将 Ma…

SpringBoot实现短链跳转

目录 1.背景介绍 2.短链跳转的意义 3.SpringBoot中的代码实现 1.建议短链-长链的数据库表&#xff1a;t_url_map: 2.映射实体 3.Dao层实现 4.Service层实现 5.Controller层实现 3.结果测试 4.问题 1.背景介绍 短链跳转是一种通过将长链接转换为短链接的方式&…

Socket网络编程(一)——网络通信入门基本概念

目录 网络通信基本概念什么是网络&#xff1f;网络通信的基本架构什么是网络编程?7层网络模型-OSI模型什么是Socket&#xff1f;Socket的作用和组成Socket传输原理Socket与TCP、UDP的关系CS模型(Client-Server Application)报文段牛刀小试&#xff08;TCP消息发送与接收&#…

OceanMind海睿思-知信版本升级:多轮对话+LLM加速!

OceanMind海睿思-知信 产品能力全新升级&#xff1a; ❖ 知识库增加多轮对话能力&#xff0c;给用户带来更“人性化”的问答体验 ❖ 自研大模型推理加速机制&#xff0c;为大模型回答提速&#xff0c;减少用户等待时间消耗 1 多轮对话升级 基于“RAG大模型”框架的知识库问…

ChatGPT科研绘图丨散点图、柱状图、小提琴图、箱型图、雷达图、玫瑰图、气泡图、森林图、三元图、三维图等各类科研图

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

Rocky Linux 运维工具 vim

一、vim的简介 vi​m是一种文本编辑器。它提供了丰富的编辑功能&#xff0c;包括插入、删除、替换文本、搜索和查找等。使用键盘命令和模式切换&#xff0c;以实现高效的文本编辑操作。 二、vim的参数说明 序号视图命令描述1命令视图i在当前光标位置进入‘INSERT视图’2命令视…

2024年四川媒体新闻发布渠道,媒体邀约资源表

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 四川有哪些媒体新闻发布渠道&#xff0c;媒体邀约资源表&#xff1f; 2024年四川媒体新闻发布渠道&#xff0c;媒体邀约资源表 四川本地媒体&#xff1a;如四川日报、华西都市报、成都商…

浅谈MySQL的B树索引与索引优化

MySQL的MyISAM、InnoDB引擎默认均使用B树索引&#xff08;查询时都显示为“BTREE”&#xff09;&#xff0c;本文讨论两个问题&#xff1a; 为什么MySQL等主流数据库选择B树的索引结构&#xff1f;如何基于索引结构&#xff0c;理解常见的MySQL索引优化思路&#xff1f; 为什…

c语言经典测试题8

在c语言经典测试题6的第一题&#xff0c;大家是否想过可不可以将递归参数改为s呢&#xff1f;或许有的人已经试过了&#xff0c;但是发现好像不会有结果&#xff0c;其实是因为s为后置&#xff0c;先试用后加1&#xff0c;然而我们这个是在s出了函数之后才会运行加1操作&#x…

spring boot学习第十三篇:使用spring security控制权限

该文章同时也讲到了如何使用swagger。 1、pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instanc…

「MySQL」增删查改

在操作数据库中的表时&#xff0c;需要先使用该数据库&#xff1a; use database;新增 创建表 先用 use 指定一个数据库,然后使用 create 新增一个表 比如建立一个学生表 mysql> use goods; mysql> create table student(-> name varchar(4),-> age int,-> …

附加Numpy数组

参考&#xff1a;Append Numpy Array 引言 在数据科学和机器学习领域&#xff0c;处理大规模数据集是一项重要且常见的任务。为了高效地处理数据&#xff0c;numpy是一个非常强大的Python库。本文将详细介绍numpy中的一个重要操作&#xff0c;即如何附加&#xff08;append&a…

【python基础学习05课_for循环以及双重for循环】

FOR循环 一、认识循环-while 1、循环条件不能超出列表长度 当i 1&#xff0c;while i < len(lst1) 时&#xff0c;i 3后, 打印print&#xff08;lst[3]&#xff09;小宋老师&#xff0c; 继续1, i 4, 4不小于 len(lst1)&#xff0c;打破循环。 2、循环条件超出列表长度报错…

94. 递归实现排列型枚举 刷题笔记

思路 依次枚举 每个位置用哪个数字 要求按照字典序最小来输出 而每次搜索下一层时i都是从1开始 也就是说 如果有小的数可以填上 那么该方案会填上这个数字 例如 当n等于3 第一次搜索 1 2 3输出后返回 返回后此时i3 第二个位置填3 1 3 2 输出后返回 此时返回到第一层…

idea 创建打包 android App

1、使用 idea 创建 android 工程 2、 配置构建 sdk 3、配置 gradle a、进入 gradle 官网&#xff0c;选择 install &#xff08;默认是最新版本&#xff09; b、选择包管理安装&#xff0c;手动安装选择下面一个即可 c、安装 sdk 并通过 sdk 安装 gradle 安装 sdk&#xff1a…

【Leetcode每日一题】二分查找 - 寻找旋转排序数组中的最小值(难度⭐⭐)(22)

1. 题目解析 Leetcode链接&#xff1a;153. 寻找旋转排序数组中的最小值 这个题目乍一看很长很复杂&#xff0c;又是旋转数组又是最小值的 但是仔细想想&#xff0c;结合题目给的示例&#xff0c;不难看出可以用二分的方法来解决 核心在于找到给定数组里面的最小值 2. 算法原…

关于vue中关于eslint报错的问题

1 代码保存的时候会自动将单引号报错为双引号 导致eslint报错的问题&#xff0c; 解决思路&#xff1a; 在项目根目录下新建一个.prettierrc.json文件 { “tabWidth”: 2,“useTabs”: false,“singleQuote”: true,“semi”: false} 2 关于报错代码的时候 出现尾随逗号报错…

C++:内存管理|new和delete

创作不易&#xff0c;感谢三连支持&#xff01; 一、内存分布 为什么需要内存管理呢&#xff1f;&#xff1f;因为我们在程序的运行过程中会需要各种各样的数据&#xff0c;而我们根据数据的不同存储在不同的区域里面&#xff0c;是为了更高效地处理数据。而C语言相比Java来说…
推荐文章