Pri*_*shi 34 java generics list arraylist guava
我们怎样才能在Guava api的帮助下从List中删除重复项?
目前我正在关注此事:
private List<T> removeDuplicate(List<T> list){
return new ArrayList<T>(new LinkedHashSet<T>(list));
}
Run Code Online (Sandbox Code Playgroud)
Lou*_*man 69
可能最有效的方法是ImmutableSet.copyOf(list).asList()消除重复并保留迭代顺序.
(但是你的实现LinkedHashSet几乎同样有效,并且不会抛出空值,万一你真的想要在你的集合中使用空值.)
Sea*_*oyd 12
我喜欢Louis的简单回答(并且因为它是唯一不需要2次完整迭代的答案),但不幸的是在现实世界中,您经常会遇到null确实发生的情况.这是一个稍微长一点的null安全版本:
ImmutableSet.copyOf(
Iterables.filter(
list, Predicates.not(Predicates.isNull()))).asList();
Run Code Online (Sandbox Code Playgroud)
或者,使用静态导入:
copyOf(filter(list, not(isNull()))).asList();
Run Code Online (Sandbox Code Playgroud)
当然,您需要了解所有null值都将从列表中丢失的事实.
与通用谓词
class DuplicateRemover<T> implements Predicate<T> {
private final Set<T> set = new HashSet<>();
@Override
public boolean apply(T input) {
boolean flag = set.contains(input);
if (!flag) {
set.add(input);
}
return !flag;
}
}
Run Code Online (Sandbox Code Playgroud)