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

Posted Java技术栈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试官:怎么去除 List 中的重复元素?我一行代码搞定,赶紧拿去用!相关的知识,希望对你有一定的参考价值。

点击关注公众号,Java干货及时送达

推荐阅读:

劝大家别再搞老旧的 Spring Cloud 了!

Spring Cloud 2022 正式发布!


问题

上次栈长给大家分享了《带了一个 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 可以保证元素的顺序性!

另外,如果你近期准备面试跳槽,建议在Java面试库小程序在线刷题,涵盖 2000+ 道 Java 面试题,几乎覆盖了所有主流技术面试题。

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面试库小程序在线刷题,涵盖 2000+ 道 Java 面试题,几乎覆盖了所有主流技术面试题。

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

End

Spring 旗下最牛逼的国产项目!

23 种设计模式实战(很全)

Spring Boot 3.0 正式发布,王炸!!

Spring Cloud Alibaba 最新重磅发布!

Nacos 2.2 正式发布,这次更新太炸了!

Spring Cloud 微服务最新课程!

以上是关于面试官:怎么去除 List 中的重复元素?我一行代码搞定,赶紧拿去用!的主要内容,如果未能解决你的问题,请参考以下文章

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

面试官:怎么删除 HashMap 中的重复元素?第 3 种实现思路,99% 的人不会!

面试官:怎么删除 HashMap 中的元素?我一行代码搞定,赶紧拿去用!

面试官:怎么删除 HashMap 中的重复元素?第 3 种实现思路,99% 的人不会!

面试官:怎么删除 HashMap 中的重复元素?第 3 种实现思路,99% 的人不会!

Set中出现重复元素