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

2017-01-08 21:54:11 +08:00
 Adia
除了双循环这种,请问各位大神还有别的好方法吗?先谢过为敬
8035 次点击
所在节点    Java
36 条回复
swim2sun
2017-01-09 10:23:06 +08:00
Java8 可以这样写:

List<String> list = Arrays.asList("1", "2", "3", "3");
Map map = list.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
webcoder
2017-01-09 10:25:44 +08:00
简单点,把一个数组 join 成一个字符,然后循环 Contains 一下。
局限点,不适用于对象数组。
注意点,需要作好数据间隔符,防止拼接后数据混乱。
vchat
2017-01-09 11:00:17 +08:00
@Adia 使用 hashset #add 方法 如果是重复的元素则返回值为 fase [HashSet#add]( http://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html#add(E))
注意: 添加元素为非基本类型(包装类型)或 String 则需要实现 equals 和 hashCode 方法确保元素唯一性
Adia
2017-01-09 11:22:01 +08:00
@xlvecle 好像不行吧
syasuker
2017-01-09 11:50:25 +08:00
也许可以 Java8 中使用 Stream 流思想进行过滤之类的
xlvecle
2017-01-09 12:02:00 +08:00
@Adia 昨天手写的,想当然了, removeAll 会全部 remove 掉,当做集合来处理
zhidian
2017-01-09 12:42:22 +08:00
for str in list:
if (str not in set) {
set <- str
} else {
// dup
}
snnn
2017-01-09 12:43:23 +08:00
sort
misaka19000
2017-01-09 13:19:13 +08:00
先排序后便利,时间复杂度 n log ( n )
Perry
2017-01-09 13:22:44 +08:00
优雅到底是什么意思?
ooTwToo
2017-01-09 13:24:33 +08:00
同意楼上,先排序后再遍历,与上个元素比对; Java Stream 有去重函数可以方便很多~
lovekohn
2017-01-09 13:28:06 +08:00
排序后,遍历下相邻的两个是否相同
fffflyfish
2017-01-09 15:09:08 +08:00
一楼说的对,这种时候就该用 hashmap,时间复杂度就是 O(n)
fffflyfish
2017-01-09 15:26:51 +08:00
![pic]( )
如何,够不够优雅
leopku
2017-01-09 15:27:15 +08:00
// Guava
List<Employee> employees = // ...
Multimaps.index(employees, e -> e.getName())

// Guava 另外一个版本
List<Employee> employees = // ...
Collection<Employee> filtered =
Collections2.filter(employees, new Predicate<Employee>() {
@Override
public boolean apply(Employee e) {
return e.getName().equals("John Doe");
}
});
// if you want a List:
List<Employee> filteredList = new ArrayList<>(filtered);


// Java 8
List<Employee> filteredList = employees.stream()
.filter(e -> e.getName().equals("John Doe"))
.collect(Collectors.toList());
mingl0280
2017-01-10 03:01:22 +08:00
//C#奇技淫巧
ArrayList b = new ArrayList();
Dictionary<int, int> x = new Dictionary<int, int>();
foreach (int elem in a)
{
try
{
x.Add(elem, 0);
}catch(Exception){
b.Add(elem);
}
}

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

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

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

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

© 2021 V2EX