网站首页 > 技术文章 正文
去除List中重复元素,这在实际编程或面试中经常遇到,每个人都有习惯的写法吧,这里抛砖引玉,汇总了一些实现方案,开拓思路。
准备数据
假设数组中有10个数据,可能有重复,需要将重复的数据从数组中去掉。
public List<String> initList = Arrays.asList(
"张三",
"李四",
"张三",
"周一",
"刘四",
"李强",
"李白",
"张三",
"李强",
"王五"
);
方案一,for循环
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,判断是否存,不存在才添加,这样就保证了元素不重复。
方案二,嵌套循环
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);
}
利用双循环,判断是否有相等的,再进行移除。
方案三,比对index
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);
}
复制两个数组,判断 list 中的元素的首尾出现的坐标位置是否一致,如果一致说明没有重复的,否则重复,再删除重复位置的元素。
方案四,借助Set的特性进行去重
public void remove4() {
List<String> list = new ArrayList(initList);
List<String> list2 = new ArrayList(new HashSet(list));
System.out.println(list2);
}
Set 数据结构是利用hash判断重复数据,只保留一份。把 List 先装进 HashSet,然后再装回来,这样就保证了元素的不重复。
方案五,Stream去重
public void remove5() {
List<String> list = new ArrayList(initList);
list = list.stream().distinct().collect(Collectors.toList());
System.out.println(list);
}
利用 Stream 的 distinct 方法去重,这个方法也十分简单,一行代码搞定!
性能比较
随机生成100000个字符串,分别测试五种方案的运行时间:
方案一:27ms
方案二:355ms
方案三:400ms
方案四:14ms
方案五:52ms
结论:利用Set去重,效率最高,但不保证顺序,保证顺序可以使用LinkedHashSet。从可读性考虑,如果不是数据量特别大的场景,更推荐stream。
- 上一篇: C#中的List可以存储哪些类型的数据?
- 下一篇: C# 基础知识系列- 3 集合数组
猜你喜欢
- 2025-01-13 Java 中 List 分片的 5 种方法
- 2025-01-13 你见过哪些实用到爆的 Java 代码技巧?
- 2025-01-13 手把手教你搭建一个基于Java的分布式爬虫系统「转」
- 2025-01-13 List的扩容机制,你真的明白吗?
- 2025-01-13 C# 基础知识系列- 3 集合数组
- 2025-01-13 C#中的List可以存储哪些类型的数据?
- 2025-01-13 java8对List集合根据某一字段进行分组
- 2025-01-13 PCHMI5.5二次开发文档(更新)
- 2025-01-13 Qt QString字符串分割、截取的3种方法
- 2025-01-13 C++ Builder 多版本实现文本文件读写,并按分隔符生成字符串列表
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- js数组插入 (83)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)