如何优雅的找出 ArrayList 中的重复元素?

2017-01-08 21:54:11 +08:00
 Adia
除了双循环这种,请问各位大神还有别的好方法吗?先谢过为敬
7354 次点击
所在节点    Java
36 条回复
murmur
2017-01-08 21:59:44 +08:00
为什么要双循环呢 第一次循环的时候如果你是往 map 里扔已经知道谁是重复的了
Lonely
2017-01-08 22:01:42 +08:00
1 楼说的对
slixurd
2017-01-08 22:02:26 +08:00
只有一个重复元素的话就是经典算法题吧
反正就是空间 /时间看需要选哪个....
不需要考虑空间就用 Map 吧.简单粗暴
pupboss
2017-01-08 22:03:36 +08:00
如果数据量大,可以用 dict ,用空间换时间
vchat
2017-01-08 22:04:49 +08:00
如果可以的话 往 set 集合里面放, 然后判断返回值 然后将重复元素放在 arraylist 里
palmers
2017-01-08 22:06:10 +08:00
同意#5 的做法
skywayman
2017-01-08 22:11:32 +08:00
最终是想找出,还是去掉多余重复的? 前者循环一次,MAP<Key,Count>计数就好,后者 Set 一次转换行. 如果使用 Stream,还可以在多 CPU 上开 Parallel.
yidinghe
2017-01-08 22:19:29 +08:00
删除重复元素:

List result = list.stream().distinct().collect(Collectors.toList());
Adia
2017-01-08 22:48:00 +08:00
@murmur 请问是类似这个思路吗?
@Lonely 请问是类似这个思路吗?
@skywayman 请问是类似这个思路吗?



public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("string1");
list.add("string1");
list.add("string1");
list.add("string1");
list.add("string3");
list.add("string2");
list.add("string2");
HashMap<String, Integer> hashMap = new HashMap<String, Integer>();
for (String string : list) {
if (hashMap.get(string) != null) {
Integer value = hashMap.get(string);
hashMap.put(string, value+1);
} else {
hashMap.put(string, 1);
}
}
for (Entry<String, Integer> entry : hashMap.entrySet()) {
String key=entry.getKey();
Integer value= entry.getValue();
if (value>1) {
System.out.println("the element:"+key+" is repeat");
}
}

}
Adia
2017-01-08 22:48:30 +08:00
@vchat 很好奇怎么写..
wd
2017-01-08 22:53:37 +08:00
@Adia 第一个循环里面加一的时候 不就可以做第二个循环里面的事情了吗?....
Adia
2017-01-08 23:04:33 +08:00
@wd 的确。这代码统计了次数,但是题目中并没有说要统计
Adia
2017-01-08 23:05:41 +08:00
@wd 哦不..看错了。不好意思
dtysky
2017-01-08 23:07:39 +08:00
没记错的话,有个方法是排序然后遍历……?
如果允许额外空间,用 map
dallaslu
2017-01-08 23:28:34 +08:00
xlvecle
2017-01-09 00:28:43 +08:00
list.removeAll(set(list))
kooze
2017-01-09 00:50:58 +08:00
rx
bhagavad
2017-01-09 05:29:20 +08:00
时间有要求还是空间有要求? ArrayList 中元素是什么类型?这些前提都得说清。
hinkal
2017-01-09 08:44:56 +08:00
@bhagavad 元素类型倒是不用说,可以假定实现了 equals 接口或 compare 接口
Adia
2017-01-09 08:48:38 +08:00
@bhagavad 没有要求,请问不同元素类型的会有什么影响吗? String

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/333143

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX