面试官:如何实现 List 集合去重?

e996b7dfb6272bf30c35247d7e908e00.png

作者 | 磊哥

来源 | Java面试真题解析(ID:aimianshi666)

转载请联系授权(微信ID:GG_Stone)

本文已收录《Java常见面试题》系列,开源地址:https://gitee.com/mydb/interview

List 去重指的是将 List 中的重复元素删除掉的过程。此题目考察的是对 List 迭代器、Set 集合和 JDK 8 中新特性的理解与灵活运用的能力。

List 去重有以下 3 种实现思路:

  1. 自定义方法去重,通过循环判断当前的元素是否存在多个,如果存在多个,则删除此重复项,循环整个集合最终得到的就是一个没有重复元素的 List;

  2. 使用 Set 集合去重,利用 Set 集合自身自带去重功能的特性,实现 List 的去重;

  3. 使用 JDK 8 中 Stream 流的去重功能。

1.自定义去重

自定义去重的实现方法有两种,首先我们可以创建一个新集合,通过循环原集合判断循环的元素,是否已存在于新集合,如果不存在则插入,否则就忽略,这样循环完,最终得到的新集合就是一个没有重复元素的集合,具体实现代码如下:

import lombok.Data;import java.util.ArrayList;
import java.util.List;public class DistinctExample {public static void main(String[] args) {// 创建并给 List 赋值List<Person> list = new ArrayList<>();list.add(new Person("李四", "123456", 20));list.add(new Person("张三", "123456", 18));list.add(new Person("王五", "123456", 22));list.add(new Person("张三", "123456", 18));// 去重操作List<Person> newList = new ArrayList<>(list.size());list.forEach(i -> {if (!newList.contains(i)) { // 如果新集合中不存在则插入newList.add(i);}});// 打印集合newList.forEach(p -> System.out.println(p));}
}@Data
class Person {private String name;private String password;private int age;public Person(String name, String password, int age) {this.name = name;this.password = password;this.age = age;}
}

以上程序执行的结果如下图所示:a4b070c38ffd42d3bd2513776bf9a673.png

自定义去重功能实现方法二,使用迭代器循环并判断当前元素首次出现的位置(indexOf)是否等于最后出现的位置(lastIndexOf),如果不等于则说明此元素为重复元素,删除当前元素即可,这样循环完就能得到一个没有重复元素的集合,实现代码如下:

import lombok.Data;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class DistinctExample {public static void main(String[] args) {// 创建并给 List 赋值List<Person> list = new ArrayList<>();list.add(new Person("李四", "123456", 20));list.add(new Person("张三", "123456", 18));list.add(new Person("王五", "123456", 22));list.add(new Person("张三", "123456", 18));// 去重操作Iterator<Person> iterator = list.iterator();while (iterator.hasNext()) {// 获取循环的值Person item = iterator.next();// 如果存在两个相同的值if (list.indexOf(item) != list.lastIndexOf(item)) {// 移除相同的值iterator.remove();}}// 打印集合信息list.forEach(p -> System.out.println(p));}
}@Data
class Person {private String name;private String password;private int age;public Person(String name, String password, int age) {this.name = name;this.password = password;this.age = age;}
}

以上程序执行的结果如下图所示:2d3ab53541749e712f4b28ec9d89bf8e.png

2.利用 Set 集合去重

Set 集合天生具备去重特性,在创建 Set 集合时可以传递一个 List 集合,这样就能实现数据转移和去重的功能了,具体实现代码如下:

import lombok.Data;import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;public class DistinctExample {public static void main(String[] args) {// 创建并给 List 赋值List<Person> list = new ArrayList<>();list.add(new Person("李四", "123456", 20));list.add(new Person("张三", "123456", 18));list.add(new Person("王五", "123456", 22));list.add(new Person("张三", "123456", 18));// 去重操作HashSet<Person> set = new HashSet<>(list);// 打印集合信息set.forEach(p -> System.out.println(p));}
}@Data
class Person {private String name;private String password;private int age;public Person(String name, String password, int age) {this.name = name;this.password = password;this.age = age;}
}

以上程序执行的结果如下图所示:c900e892d2862b24c00cfb93306616e0.png通过上述结果,我们发现了一个问题,在使用了 HashSet 去重之后,元素的先后顺序竟然也发生了变化。为了能解决这个问题,我们可以使用 LinkedHashSet 来实现去重功能,具体实现代码如下:

import lombok.Data;import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;public class DistinctExample {public static void main(String[] args) {// 创建并给 List 赋值List<Person> list = new ArrayList<>();list.add(new Person("李四", "123456", 20));list.add(new Person("张三", "123456", 18));list.add(new Person("王五", "123456", 22));list.add(new Person("张三", "123456", 18));// 去重操作LinkedHashSet<Person> set = new LinkedHashSet<>(list);// 打印集合信息set.forEach(p -> System.out.println(p));}
}@Data
class Person {private String name;private String password;private int age;public Person(String name, String password, int age) {this.name = name;this.password = password;this.age = age;}
}

以上程序执行的结果如下图所示:74df220dd9b52338e33a0dc3cdaa5574.png

3.使用 Stream 去重

最后一种也是最简单的一种去重方式,我们可以使用 JDK 8 中提供的 Stream 进行去重,Stream 中包含了一个去重方法:distinct,可以直接实现集合的去重功能,具体实现代码如下:

import lombok.Data;import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class DistinctExample {public static void main(String[] args) {// 创建并给 List 赋值List<Person> list = new ArrayList<>();list.add(new Person("李四", "123456", 20));list.add(new Person("张三", "123456", 18));list.add(new Person("王五", "123456", 22));list.add(new Person("张三", "123456", 18));// 去重操作list = list.stream().distinct().collect(Collectors.toList());// 打印集合信息list.forEach(p -> System.out.println(p));}
}@Data
class Person {private String name;private String password;private int age;public Person(String name, String password, int age) {this.name = name;this.password = password;this.age = age;}
}

以上程序执行的结果如下图所示:31ad1856e1df6a0edeb389a3cc70c187.png

总结

本文介绍了 List 集合去重的 3 种实现思路,其中自定义去重功能实现起来相对繁琐,而 Set 集合依靠其自带的去重特性,可以很方便的实现去重功能,并且可以使用 LinkedHashSet 在去重的同时又保证了元素所在位置不被更改。而最后一种去重的方法,是 JDK 8 中新增的,使用 Stream 中的 distinct 方法实现去重,它的优点是不但写法简单,而且无需创建新的集合,是实现去重功能的首选方法。

是非审之于己,毁誉听之于人,得失安之于数。

博主介绍:80 后程序员,写博客这件事“坚持”了 12 年了,爱好:读书、慢跑、羽毛球。 

e1068c6f46b62a563bf918248722ce97.gif

往期推荐

6572cb2a39796f1230cb4451b05fb70f.png

面试官:HashMap有几种遍历方法?推荐使用哪种?


8524407358a336c46589b7c36937a3b3.png

面试官:元素排序Comparable和Comparator有什么区别?


54a361033d15f062bbc3c97bfca465ea.png

面试官:final、finally、finalize 有什么区别?



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

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

相关文章

Windows重装Anaconda3失败解决方案【重装失败10来次首次成功的案例!】

文章目录0.环境1.原因2.解决方案0.环境 Win10 Anaconda3 2018版 python 3.7.1 注意&#xff01;此种情况只会在windows上发生&#xff0c;因为在linux上你只需要删除anaconda3整个文件夹&#xff0c;重新安装一定会成功&#xff01; 1.原因 Anaconda肯定是没有成功安装的&am…

python读取pcd点云/转numpy(python2+python3,非ROS环境)

0.引言 \qquadROS的PCL库支持python读取点云&#xff0c;ROS1关联的是python2&#xff08;2.7&#xff09;&#xff0c;ROS2关联的是python3&#xff08;>3.5&#xff09;&#xff0c;但这对于windows的用户和没装ROS的ubuntu用户似乎不够友好。下面就介绍两种不需要ros的方…

Java中List排序的3种方法!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;在某些特殊的场景下&#xff0c;我们需要在 Java 程序中对 List 集合进行排序操作。比如从第三方接口中获取所有用户的列表&…

Spring 事务失效的 8 种场景!

在日常工作中&#xff0c;如果对Spring的事务管理功能使用不当&#xff0c;则会造成Spring事务不生效的问题。而针对Spring事务不生效的问题&#xff0c;也是在跳槽面试中被问的比较频繁的一个问题。点击上方卡片关注我今天&#xff0c;我们就一起梳理下有哪些场景会导致Spring…

vscode无法识别constexpr

问题 vscode 无法识别constexpr&#xff08;常指针类型&#xff09; 方法 打开工程路径下的.vscode文件夹&#xff08;一般是自动隐藏的&#xff0c;CtrlH显示隐藏&#xff09;设置c_cpp_properties.json文件如下&#xff1a; {"configurations": [{"name…

三流Java搞技术,二流Java搞框架,一流Java…

如何反驳“99&#xff05; 的 Java 程序员都是 Spring 程序员”这句话&#xff1f;答案是不能。互联网发展至今&#xff0c;站在巨人肩膀上编程像一日三餐一样寻常。Spring Boot 的确凭一己之力拉低了 Java 开发的门槛&#xff0c;可普通开发与高开之间&#xff0c;真就因为一个…

【Ubuntu】vscode配置PCL库/vscode无法导入PCL库

问题 PCL库是ROS框架自带的点云处理库&#xff0c;可以通过find_package(PCL REQUIRED)在CMakeLists.txt中导入&#xff0c;但是vscode却无法识别&#xff0c;出现问题如下&#xff1a; 注意&#xff0c;本文解决方案仅限Ubuntu&#xff01; 解决方案 打开工程路径下的.vsc…

面试官:HashSet是如何保证元素不重复的?

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;本文已收录《Java常见面试题》系列&#xff0c;开源地址&#xff1a;https://gitee.com/mydb/interviewHashSet 实现…

【Ubuntu】Ubuntu 20.04无法识别网口/以太网/有线网卡

这里写自定义目录标题0.症状1.查看网卡类型2.下载网卡驱动3.安装网卡驱动0.症状 \qquad表现为插入以太网网口后右上角没有显示网络&#xff0c;即没有下图的音量左侧的标志 打开设置的【网络】选项没有以太网接入&#xff0c;然而以太网口信号灯仍然正常闪烁。这种情况基本可以…

小心Lombok用法中的坑

刚才写完了代码&#xff0c;自测的时候&#xff0c;出现了NPE问题。排查的时候发现是Lombok的坑&#xff0c;以前也遇到过&#xff0c;所以觉得有必要过来记录一下。我先描述一下现象&#xff0c;我的代码里面订单服务A 需要调用缓存服务B&#xff0c;服务B就是一个Bean&#x…

【VSCode】VSCode使用conda环境时找不到python包/找不到Module

这里写自定义目录标题0.问题描述1.原因2.解决方法0.问题描述 \qquad首先需要排除是否是VSCode未配置conda环境的问题&#xff0c;当然&#xff0c;相信VSCode的老粉都不会犯这个低级错误&#xff0c;请CtrlP&#xff0c;在搜索框>select interpreter检查一下python环境。 …

PS如何对JPG文件直接抠图

如何JPG文件直接抠图 先转为智能对象&#xff1a; 再栅格化图层 此进即可直接进行抠图&#xff01;

更快的Maven来了,我的天,速度提升了8倍!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;周末被 maven-mvnd 刷屏了&#xff0c;于是我也下载了一个 mvnd 体验了一把。虽然测试的数据都是基于我本地项目&#xff0c…

Java 中接口和抽象类竟然有 7 点不同?

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;本文已收录《Java常见面试题》系列&#xff1a;https://gitee.com/mydb/interviewJava 是一门面向对象的编程语言&am…

粉丝不在于多,在于够残

李善友&#xff1a;所有可能被互联网取代的组织一定会被取代 2015-07-30 格局视野 格局视野 格局视野 微信号 geju365 功能介绍 格局生涯学院官方自媒体。面向互联网人的在线商学院。推送互联网行业知识&#xff0c;培养互联网实操人才。聚焦新行业、新模式、新公司、新人物。…

保姆级教学:缓存穿透、缓存击穿和缓存雪崩!

前言对于从事后端开发的同学来说&#xff0c;缓存已经变成的项目中必不可少的技术之一。没错&#xff0c;缓存能给我们系统显著的提升性能。但如果你使用不好&#xff0c;或者缺乏相关经验&#xff0c;它也会带来很多意想不到的问题。今天我们一起聊聊如果在项目中引入了缓存&a…

Fast Global Registration (ECCV 2016) 论文解析

目录0.友情链接1. 论文核心思想1.1. 点云特征匹配1.2. 两个校验1.3. 鲁棒函数与BR对偶1.4.1. Black-Rangarjan Duality (BR对偶性&#xff09;1.4.2.Derivation of Φρ\Phi_\rhoΦρ​1.4.3.E(T,L)E(\bm{T},L)E(T,L)的优化求解方法4.写在后面0.友情链接 FGR基本介绍 CSDN博客…

系统盘压缩卷小于可用空间_操作系统中的可用空间管理

系统盘压缩卷小于可用空间可用空间管理 (Free space management) As we know that the memory space in the disk is limited. So we need to use the space of the deleted files for the allocation of the new file. one optical disk allows only one write at a time in t…

关于头文件是否参与编译的讨论

一、文章来由 写项目的时候发现了这个问题&#xff0c;又是一个比较底层的问题&#xff0c;首先说明&#xff0c;这篇文章只是我根据查阅的资料和做的实验提出的一个讨论&#xff0c;并不一定就是正确答案。因为这个问题网上众说纷纭&#xff0c;我很欢迎大家参与这个讨论&…

Log4j漏洞?一行代码都不改就能永久修复?

△Hollis, 一个对Coding有着独特追求的人△作者 l Hollis来源 l Hollis&#xff08;ID&#xff1a;hollischuang&#xff09;这篇文章我周一发过&#xff0c;但是因为一些"人在江湖、身不由己"的原因&#xff0c;原文删除了&#xff0c;但是很多人找我还是想看看内容…