想去除List重复元素?我有两种方法搞定,赶紧拿去用

news/2024/10/22 8:01:50/

关注“Java架构栈”微信公众号,回复暗号【Java面试题】即可获取大厂面试题

 问题背景

最近就有很多小伙伴在后台私信波哥,问波哥这样一个问题:“波哥,我最近正在找工作,被面试官问到List该怎么去重?我感觉自己的回答没有get到面试官的预期结果,请问波哥这个问题怎么回答才能让面试官满意呢?” 对于这个问题,波哥会建议大家采用JDK 8中的stream进行去重,为什么呢?请看接下来波哥给大家的分析吧。

 List去重方式

为了让大家能够比较完美地回答这个问题,波哥会给大家展示以下几种经典的去重方式。

2.1 迭代器去重

第一种方式,我们可以使用迭代器来循环判断每一项数据,如果当前循环到的数据,在集合中存在两份或两份以上,就将当前的元素删除掉。这样循环完之后,我们就可以得到一个没有重复数据的集合,这是一种比较常见的去重方式,其实现代码如下:

public class ListTest {public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>() {{add(2); add(5); add(9);add(2); add(4); add(9);add(3); add(7); add(8);}};System.out.println("原list:"+list);test(list); }public static void test(List<Integer> list){Iterator<Integer> iterator = list.iterator();while (iterator.hasNext()){Integer integer = iterator.next();if(list.indexOf(integer)!=list.lastIndexOf(integer)){iterator.remove();} }System.out.println("新list:"+list); }}

运行上面的代码会得到以下结果:

但是细心的你可以或许可以看到,在使用迭代器去重的时候,List结果的顺序是混乱的,跟原来的集合顺序并不一样,这如何搞?

2.2 Stream去重

这个时候,波哥就要给小伙伴介绍一种新的实现方案了。如果你可以回答出这一点,我相信面试官会满意的颔首的。这种实现方式,是利用JDK8为我们带来的Stream流。使用Stream可以让我们轻松地实现很多功能,比如下面的去重效果:

public class ListTest {public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>() {{add(2); add(5); add(9);add(2); add(4); add(9);add(3); add(7); add(8);}};System.out.println("原list:"+list);test(list);}public static void test(List<Integer> list){list=list.stream().distinct().collect(Collectors.toList());System.out.println("新list:"+list); }
}

现在你看,上面的实现代码比迭代器的实现方式更简单,运行上面的代码会得到以下结果:

而且利用stream()方法,我们不仅对运行结果实现了去重,还没有改变原来的集合元素顺序,保证了集合内容的有序性,这比传统的去重方式更简单有效,且性能也更高哦!

 小结

除了以上两种方式之外,其实我们还有一些别的方法也可以对List集合去重。本文波哥只是给大家讲解了以上两种,就当是抛砖引玉吧,如果你还知道别的方式,可以在评论区给出你的答案。今天的内容你学会了吗?关注Java架构栈,干货天天都不断!


http://www.ppmy.cn/news/499636.html

相关文章

Java关于反射的理解

关于反射的理解 Reflection&#xff08;反射)是被视为动态语言的关键&#xff0c;反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息&#xff0c;并能直接操作任意对象的内部属性及方法。 框架 反射 注解 设计模式。 3.体会反射机制的“动态性” //体会…

纯RAW数据转换为DNG格式

手上有一个没有任何header信息的RAW文件&#xff0c;是从相机传感器直接输出的&#xff0c;格式是一个一维的数组&#xff0c;大小是1,310,720&#xff0c;也就是1024*1280. 想使用rawpy来模拟ISP的处理流程&#xff0c;但是很不幸的是&#xff0c;rawpy不支持直接处理这种没有…

Capture One Pro12.0.3.22 中文版l飞思RAW软件 【含教程】

支持win7、win10X64位系统 Capture One Pro 是专业的原始文件转换器和图像编辑软件。它将所有必备工具和高端性能融于一体、使您在一套快捷、灵活且有效的工作流程中捕获、整理、编辑、分享以及打印图像。Capture One Pro 强大且直观的工具组合为专业摄影师所使用、以卓越色彩和…

视觉惯性组合导航技术最新综述:应用优势、主要类别及一种视觉惯性组合导航无人系统开发验证平台分享

导读: 随着无人机、无人车以及移动机器人的井喷式发展&#xff0c;导航技术成为了制约无人平台广泛应用的瓶颈技术之一。在应用需求的牵引下&#xff0c;视觉惯性组合导航技术&#xff0c;特别是视觉与微惯性传感器的组合&#xff0c;逐渐发展成为当前自主导航及机器人领域的研…

行业前沿|无人机视觉自主导航发展及视觉智能开发支撑平台介绍

01视觉自主导航技术基本介绍 近年来&#xff0c;无人机在多领域表现出重要应用价值。目前&#xff0c;无人机如何在未知封闭、无辅助导航支撑的环境中&#xff0c;达成“在哪里”和“环境描述”并自主智能地完成特定任务&#xff0c;是一个重要的研究热点方向。 其中&#xff…

python点云快速配准_分享一个V-SLAM中点云配准算法改进的方法

近年来&#xff0c;随着自主导航的广泛应用&#xff0c;视觉同时定位与地图构建(Visual simultaneous localization and mapping, V-SLAM)通过自身携带的视觉传感器对周围环境进行重构并且估计出自身的位置&#xff0c;准确定位与高精度的V-SLAM算法是实现自主导航的关键技术。…

你必须知道的mac原始文件转换器和raw图像编辑软件capture one 20

capture one 20 mac中文版软件介绍 Capture One Pro 20是专业的原始文件转换器和图像编辑软件。它将所有必备工具和高端性能融于一体、使您在一套快捷、灵活且有效的工作流程中捕获、整理、编辑、分享以及打印图像。Capture One Pro 强大且直观的工具组合为专业摄影师所使用、…

猿创征文 | 一文看懂!无人机集群半物理仿真系统的7大模块拆解,超详细!

在无人机集群研究领域&#xff0c;仿真验证技术可以高效且低廉的对算法理论&#xff0c;极大的缩短研制周期&#xff0c;降低研制成本。全数字仿真技术和半物理仿真技术是仿真验证技术的两种主要实现方式&#xff0c;本篇带你快速了解无人机集群半物理仿真系统&#xff01; ——…