当前位置: 首页 > 科技观察

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

时间:2023-03-22 15:30:26 科技观察

List去重是指删除List中重复元素的过程。本题考查理解和灵活使用List迭代器、Set集合以及JDK8新特性的能力。List去重有以下三种实现思路:自定义方法去重,通过循环判断当前是否有多个元素,如果有多个,删除重复项,循环整个集合,最后得到一个无重复元素的List;利用Set集合去重,利用Set集合自身去重功能的特点,实现List的去重;使用JDK8中Stream流的去重功能。1.自定义重复数据删除有两种方法可以实现自定义重复数据删除。首先,我们可以创建一个新的集合,通过循环原集合来判断新集合中循环的元素是否已经存在。如果没有,插入它,否则忽略它,经过这个循环,最终的新集合是一个没有重复元素的集合。具体实现代码如下:importlombok.Data;importjava.util.ArrayList;importjava.util.List;publicclassDistinctExample{publicstaticvoidmain(String[]args){//创建List并赋值Listlist=newArrayList<>();list.add(newPerson("李四","123456",20));list.add(newPerson("张三","123456",18));list.add(newPerson("王Wu","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{privateStringname;privateStringpassword;privateintage;publicPerson(Stringname,Stringpassword,intage){this.name=name;this.password=password;this.age=age;}}上述程序执行结果如下图所示:实现自定义去重功能的方法二,使用迭代器来查找p并判断当前元素第一次出现的位置(indexOf)等于最最后一个位置(lastIndexOf),如果不相等,说明这个元素是重复元素,删除当前元素即可,这样循环后可以得到一个没有重复元素的集合,实现代码如下:importlombok.Data;importjava.util。ArrayList;importjava.util.Iterator;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));//去重操作Iteratoriterator=list.iterator();while(iterator.hasNext()){//获取循环值Personitem=iterator.next();//如果有两个相同的值if(list.indexOf(item)!=list.lastIndexOf(item)){//移除相同的值iterator.remove();}}//打印集合信息list.forEach(p->System.out.println(p));}}@DataclassPerson{privateStringname;privateStringpassword;privateintage;publicPerson(Stringname,Stringpassword,intage){this.name=name;this.password=password;this.age=age;}}上面程序执行结果如下图所示:2.使用集合集合重复数据删除集合集合本质上是重复数据删除的。在创建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{privateStringname;privateStringpassword;privateintage;publicPerson(Stringname,Stringpassword,intage){this.name=name;this.password=password;this.age=age;}}上面的程序执行结果如下图所示:通过上面的结果,我们发现了一个问题。使用HashSet去重后,元素的顺序也发生了变化。为了解决这个问题,我们可以使用LinkedHashSet来实现去重功能。具体实现代码如下:importlombok.Data;importjava.util.ArrayList;importjava.util.LinkedHashSet;importjava.util.List;publicclassDistinctExample{publicstaticvoidmain(String[]args){//创建List并赋值Listlist=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{privateStringname;privateStringpassword;privateintage;publicPerson(Stringname,Stringpassword,intage){this.name=name;this.password=password;this.age=age;}}上面程序执行的结果如下图所示: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());//打印采集信息列表.forEach(p->System.out.println(p));}}@DataclassPerson{privateStringname;privateStringpassword;privateintage;publicPerson(Stringname,Stringpassword,intage){this.name=name;this.password=password;this.age=age;}}以上程序执行结果如下图所示:总结本文介绍了List集合去重的三种实现思路,其中自定义去重功能实现起来比较繁琐,Set集合依赖于其自带的去重特性可以轻松实现去重功能,可以在保证元素位置不变的情况下使用LinkedHashSet去重。最后一个去重方法是JDK8新增的,使用Stream中的distinct方法实现去重。它的优点是不仅写法简单,而且不需要创建新的集合。它是实现重复数据删除功能的首选方法。判断是非在自己,名誉在别人,得失在人数。博主介绍:80后程序员,“坚持”写博客12年。爱好:阅读、慢跑和羽毛球。本文转载自微信公众号《Java面试题解析》,可通过以下二维码关注。转载本文请联系Java面试真题解析公众号。