当前位置: 首页 > 后端技术 > Java

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

时间:2023-04-02 01:32:36 Java

本文已收录《Java常见面试题》系列,Gitee开源地址:https://gitee.com/mydb/interviewList去重是指删除List中重复元素的过程。本题考查理解和灵活使用List迭代器、Set集合以及JDK8新特性的能力。List去重有以下三种实现思路:自定义方法去重,通过循环判断当前list是否有多个元素,如果有多个,删除重复项,循环整个集合,最后得到一个没有重复元素的列表List;使用Set集合去重,利用Set集合自身去重功能的特点,实现List的去重;使用JDK8中Stream流的去重功能。1.自定义重复数据删除有两种方法可以实现自定义重复数据删除。首先,我们可以创建一个新的集合,通过循环原集合来判断循环的元素是否已经存在于新的集合中。如果没有,插入它,否则忽略它,经过这个循环,最终的新集合是一个没有重复元素的集合。具体实现代码如下:importlombok.Data;importjava.util.ArrayList;importjava.util.List;publicclassDistinctExample{publicstaticvoidmain(String[]args){//创建并赋值Listlist=newArrayList<>();list.add(newPerson("丽丝","123456",20));list.add(newPerson("张三","123456",18));list.add(newPerson("王舞","123456",22));list.add(newPerson("张三","123456",18));//去重操作ListnewList=newArrayList<>(list.size());list.forEach(i->{if(!newList.contains(i)){//插入newList.add(i);}});//打印集合newList.forEach(p->System.out.println(p));}}@DataclassPerson{私有字符串名称;私有字符串密码;私人年龄;publicPerson(字符串名称,Stringpassword,intage){this.name=name;this.password=密码;这个。年龄=年龄;}}上述程序执行结果如下图所示:实现自定义去重功能的方法二,使用迭代器循环并判断当前元素第一次出现的位置(indexOf)是否等于最后一次出现的位置position(lastIndexOf),如果不是,说明这个元素是重复元素,删除当前元素即可,这样循环后就可以得到一个没有重复元素的集合,实现代码如下:importlombok.Data;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;publicclassDistinctExample{publicstaticvoidmain(String[]args){//创建并赋值给列表Listlist=新数组列表<>();list.add(newPerson("李四","123456",20));list.add(newPerson("张三","123456",18));list.add(newPerson("王舞","123456",22));list.add(newPerson("张三","123456",18));//去重操作Iteratoriterator=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));}}@DataclassPerson{私有字符串名称;私人字符串密码;私人年龄;publicPerson(Stringname,Stringpassword,intage){this.name=name;this.password=密码;这个。年龄=年龄;}}上面程序执行的结果如下图所示:2.使用Set集合去重Set集合本身就是去重的。在创建Set集合时,可以传入一个List集合,这样就可以实现数据传输和去重功能。具体实现代码如下:importlombok.Data;importjava。util.ArrayList;importjava.util.HashSet;importjava.util.List;publicclassDistinctExample{publicstaticvoidmain(String[]args){//创建并分配Listlist=newArrayList<>();list.add(newPerson("李四","123456",20));list.add(newPerson("张三","123456",18));list.add(newPerson("王舞","123456",22));list.add(newPerson("张三","123456",18));//去重操作HashSetset=newHashSet<>(list);//打印集合信息set.forEach(p->System.out.println(p));}}@DataclassPerson{私有字符串名称;私有字符串密码;私人年龄;publicPerson(Stringname,Stringpassword,intage){this.name=name;this.password=密码;这个。年龄=年龄;}}上面程序执行的结果如下图所示:通过上面的结果,我们发现了一个问题。使用HashSet去重后,元素的顺序发生了变化。为了解决这个问题,我们可以使用LinkedHashSet来实现去重功能。具体实现代码如下:importlombok.Data;导入java.util.ArrayList;导入java.util.LinkedHashSet;导入java.util.List;publicclassDistinctExample{publicstaticvoidmain(String[]args){//创建并赋值给ListListlist=newArrayList<>();list.add(newPerson("李四","123456",20));list.add(newPerson("张三","123456",18));list.add(newPerson("王舞","123456",22));list.add(newPerson("张三","123456",18));//去重操作LinkedHashSetset=newLinkedHashSet<>(list);//打印集合信息set.forEach(p->System.out.println(p));}}@DataclassPerson{私有字符串名称;私有字符串密码;私人年龄;publicPerson(Stringname,Stringpassword,intage){this.name=name;this.password=密码;这个。年龄=年龄;}}上面程序执行的结果如下图所示:3.使用Stream去重最后也是最简单的去重方式,我们可以使用JDK8提供的Stream去重,Stream中包含一个去重方法:distinct,可以直接实现集合的去重功能,具体实现代码如下:importlombok.Data;importjava.util.ArrayList;importjava.util.List;importjava.util.stream.Collectors;publicclassDistinctExample{publicstaticvoidmain(String[]args){//创建并分配Listlist=newArrayList<>();list.add(newPerson("李四","123456",20));list.add(newPerson("张三","123456",18));list.add(newPerson("王舞","123456",22));list.add(newPerson("张三","123456",18));//去重操作list=list.stream().distinct().collect(Collectors.toList());//打印集合信息list.forEach(p->System.out.println(p));}}@DataclassPerson{私有字符串名称;私有字符串密码;私人年龄;publicPerson(Stringname,Stringpassword,intage){this.name=name;this.password=密码;这个。年龄=年龄;}}上述程序执行结果如下图所示:总结duplicate功能实现起来比较繁琐,而Set集合依赖自身的去重特性,可以轻松实现去重功能,使用LinkedHashSet去重,同时保证元素位置不变。最后一个去重方法是JDK8新加入的,使用Stream中的distinct方法来实现去重。它的优点是不仅写法简单,而且不需要创建新的集合。它是实现重复数据删除功能的首选方法。判断是非在自己,名誉在别人,得失在人数。博主介绍:80后程序员,“坚持”写博客12年。爱好:阅读、慢跑和羽毛球。我的公众号:Java面试真题解析