共计 2914 个字符,预计需要花费 8 分钟才能阅读完成。
问题
上次栈长给大家分享了《带了一个 3 年的开发,不会循环删除 List 中的元素,我几乎解体!!》,上次也给大家留了个小话题:
怎么去除 List\<String> 中的反复元素呢?
尽管两个话题差不多,但实现起来就天壤之别了,废话少说,来看看都有哪些实现形式,这仅是我集体的实现计划,不肯定全,也不肯定是最优的,欢送大家拍砖。
List 去重计划
假如有以下数据:
/**
* 3 个张三,2 个李强
*/
public List<String> initList = Arrays.asList(
"张三",
"李四",
"张三",
"周一",
"刘四",
"李强",
"李白",
"张三",
"李强",
"王五"
);
本文所有残缺示例源代码曾经上传:
https://github.com/javastacks…
欢送 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 能够保障元素的程序性!
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…
欢送 Star 学习,前面 Java 示例都会在这下面提供!
你还晓得哪些去重技巧?欢送留言分享~
好了,明天的分享就到这里了,前面栈长会分享更多好玩的 Java 技术和最新的技术资讯,关注公众号 Java 技术栈第一工夫推送,我也将支流 Java 面试题和参考答案都整顿好了,在公众号后盾回复关键字 “ 面试 ” 进行刷题。
版权申明: 本文系公众号 “Java 技术栈 ” 原创,转载、援用本文内容请注明出处,剽窃、洗稿一律投诉侵权,后果自负,并保留追究其法律责任的权力。
近期热文举荐:
1.1,000+ 道 Java 面试题及答案整顿 (2022 最新版)
2. 劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4. 别再写满屏的爆爆爆炸类了,试试装璜器模式,这才是优雅的形式!!
5.《Java 开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞 + 转发哦!