首页IT科技如何去除list的重复数据(面试官:怎么去除 List 中的重复元素?我一行代码搞定,赶紧拿去用!)

如何去除list的重复数据(面试官:怎么去除 List 中的重复元素?我一行代码搞定,赶紧拿去用!)

时间2025-07-30 01:15:20分类IT科技浏览4373
导读:问题 上次栈长给大家分享了《带了一个 3 年的开发,不会循环删除 List 中的元素,我简直崩溃!!》,上次也给大家留了个小话题:...

问题

上次栈长给大家分享了《带了一个 3 年的开发            ,不会循环删除 List 中的元素                   ,我简直崩溃!!》      ,上次也给大家留了个小话题:

怎么去除 List<String> 中的重复元素呢?

虽然两个话题差不多         ,但实现起来就大相径庭了                   ,废话少说         ,来看看都有哪些实现方式      ,这仅是我个人的实现方案                   ,不一定全             ,也不一定是最优的   ,欢迎大家拍砖            。

List 去重方案

假设有以下数据:

/** * 3 个张三                  ,2 个李强 */ public List<String> initList = Arrays.asList( "张三", "李四", "张三", "周一", "刘四", "李强", "李白", "张三", "李强", "王五" );

本文所有完整示例源代码已经上传:

https://github.com/javastacks/javastack

欢迎 Star 学习                ,后面 Java 示例都会在这上面提供!

1            、for 循环添加去重 /** * for 循环添加去重 * @author: 栈长 * @from: 公众号Java技术栈 */ @Test public void remove1() { List<String> list = new ArrayList(initList); List<String> list2 = new ArrayList<>(); for (String element : list) { if (!list2.contains(element)) { list2.add(element); } } System.out.println(list2); }

这个是最基本的实现了,创建一个空的 List               ,添加前判断一下存在不存在                   ,不存在才添加   ,这样就保证了元素不重复                   。

输出结果:

[张三, 李四, 周一, 刘四, 李强, 李白, 王五]

2                   、for 双循环去重 /** * for 双循环去重 * @author: 栈长 * @from: 公众号Java技术栈 */ @Test public void remove2() { List<String> list = new ArrayList(initList); for (int i = 0; i < list.size() - 1; i++) { for (int j = list.size() - 1; j > i; j--) { if (list.get(j).equals(list.get(i))) { list.remove(j); } } } System.out.println(list); }

利用双循环            ,判断是否有相等的                   ,再进行移除      。

输出结果:

[张三, 李四, 周一, 刘四, 李强, 李白, 王五]

3      、for 循环重复坐标去重 /** * for 循环重复坐标去重 * @author: 栈长 * @from: 公众号Java技术栈 */ @Test public void remove3() { List<String> list = new ArrayList(initList); List<String> list2 = new ArrayList(initList); for (String element : list2) { if (list.indexOf(element) != list.lastIndexOf(element)) { list.remove(list.lastIndexOf(element)); } } System.out.println(list); }

这种方式很新颖吧?

复制一个 list2      ,再循环 List2         ,判断 list 中的元素的首尾出现的坐标位置是否一致                   ,如果一致         ,则说明没有重复的      ,否则重复                   ,再删除重复的位置的元素         。

输出结果:

[张三, 李四, 周一, 刘四, 李强, 李白, 王五]

4         、Set 去重 /** * Set 去重 * @author: 栈长 * @from: 公众号Java技术栈 */ @Test public void remove4() { List<String> list = new ArrayList(initList); List<String> list2 = new ArrayList(new HashSet(list)); System.out.println(list2); }

这招也太简单了吧             ,一行代码搞定!

我们知道 Set 是不包含重复元素的   ,把 List 先装进 HashSet                  ,然后再装回来                ,这样就保证了元素的不重复                   。

输出结果:

[李强, 李四, 张三, 周一, 李白, 王五, 刘四]

结果虽然正确,但元素顺序和原始 List 不一致               ,如果要保证顺序性                   ,可以把 HashSet 换成 LinkedHashSet:

/** * Set 去重 * @author: 栈长 * @from: 公众号Java技术栈 */ @Test public void remove4() { List<String> list = new ArrayList(initList); List<String> list2 = new ArrayList(new LinkedHashSet(list)); System.out.println(list2); }

输出结果:

[张三, 李四, 周一, 刘四, 李强, 李白, 王五]

这下顺序对了吧   ,LinkedHashSet 可以保证元素的顺序性!

5                   、Stream 去重 /** * Stream 去重 * @author: 栈长 * @from: 公众号Java技术栈 */ @Test public void remove5() { List<String> list = new ArrayList(initList); list = list.stream().distinct().collect(Collectors.toList()); System.out.println(list); }

利用 Stream 的 distinct 方法去重            ,这个方法也十分简单                   ,一行代码搞定!Stream 基础就不介绍了      ,Stream 系列我之前写过一个专题了         ,不懂的关注公众号Java技术栈                   ,然后在公众号 Java 教程菜单中阅读         。

输出结果:

[张三, 李四, 周一, 刘四, 李强, 李白, 王五]

总结

本文总结了 5 种去除 List 重复元素的方法:

for 循环添加去重 for 双循环去重 for 循环重复坐标去重 Set 去重 Stream 去重

最后两种方案最简单         ,都是一行代码就能搞定的      ,推荐使用!

所以说                   ,你身边还有谁不会删除 List 中的元素?还有谁不会 List 去重的?把这篇文章发给他吧             ,让大家少走弯路   ,少写垃圾代码                  ,共同进步      。

本文所有完整示例源代码已经上传:

https://github.com/javastacks/javastack

欢迎 Star 学习                ,后面 Java 示例都会在这上面提供!

你还知道哪些去重技巧?欢迎留言分享~

好了,今天的分享就到这里了               ,后面栈长会分享更多好玩的 Java 技术和最新的技术资讯                   ,关注公众号Java技术栈第一时间推送   ,我也将主流 Java 面试题和参考答案都整理好了            ,在公众号后台回复关键字 "面试" 进行刷题                   。

版权声明: 本文系公众号 "Java技术栈" 原创                   ,转载         、引用本文内容请注明出处      ,抄袭      、洗稿一律投诉侵权         ,后果自负                   ,并保留追究其法律责任的权利             。

近期热文推荐:

1.1,000+ 道 Java面试题及答案整理(2022最新版)

2.劲爆!Java 协程要来了   。                  。                。

3.Spring Boot 2.x 教程         ,太全了!

4.别再写满屏的爆爆爆炸类了      ,试试装饰器模式                   ,这才是优雅的方式!!

5.《Java开发手册(嵩山版)》最新发布             ,速速下载!

觉得不错   ,别忘了随手点赞+转发哦!

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
前端组件是什么(前端设计模式——组合模式) wordpress个人博客网站(打造个人博客的首选-WordPress收集)