Java 使用番石榴从列表中删除重复项
我们如何在番石榴api的帮助下从列表中删除重复项 目前,我正在关注以下内容:Java 使用番石榴从列表中删除重复项,java,list,generics,arraylist,guava,Java,List,Generics,Arraylist,Guava,我们如何在番石榴api的帮助下从列表中删除重复项 目前,我正在关注以下内容: private List<T> removeDuplicate(List<T> list){ return new ArrayList<T>(new LinkedHashSet<T>(list)); } private List removeDuplicate(列表列表){ 返回新的ArrayList(新的LinkedHashSet(list)); } 您可以尝试使用G
private List<T> removeDuplicate(List<T> list){
return new ArrayList<T>(new LinkedHashSet<T>(list));
}
private List removeDuplicate(列表列表){
返回新的ArrayList(新的LinkedHashSet(list));
}
您可以尝试使用Guava的MultiSet API删除重复项。只需添加您的列表即可完成设置并使用count方法
如果你想以任何价格使用番石榴,你可以
return new ArrayList<T>(HashMultiSet<T>.create(list).elementSet())
返回新的ArrayList(HashMultiSet.create(list.elementSet())
我真的不建议使用(链接的)HashMultiSet
来完成通常使用ArrayList
和(链接的)HashSet
来完成的任务,就像上面提到的OP一样-它对普通Java程序员来说可读性较差,而且(可能)效率较低
相反,至少使用静态工厂构造函数,如和,以避免所有这些
s:
private static <T> List<T> removeDuplicate(final List<T> list) {
return Lists.newArrayList(Sets.newLinkedHashSet(list));
}
这种方法只涉及一个复制,因为它返回一个视图。最有效的方法可能是
ImmutableSet.copyOf(list).asList()
,它消除重复并保留迭代顺序
(但是您使用LinkedHashSet
实现的效率几乎相同,并且不会出现空值,在不太可能的情况下,您实际上希望在集合中使用空值。)我喜欢它的简单性(因为它是唯一不需要两次完整迭代的答案),但不幸的是在现实世界中,您经常会遇到出现null
的情况。下面是一个稍长的空安全版本:
ImmutableSet.copyOf(
Iterables.filter(
list, Predicates.not(Predicates.isNull()))).asList();
或者,对于静态导入:
copyOf(filter(list, not(isNull()))).asList();
当然,您需要知道,所有
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;
}
}
类DuplicateRemover实现谓词{
私有最终集=新HashSet();
@凌驾
公共布尔应用(T输入){
布尔标志=set.contains(输入);
如果(!标志){
set.add(输入);
}
返回!旗帜;
}
}
如果basic set能做到这一点,你为什么喜欢吃番石榴?而且以如此简洁的方式,too@PriyankDoshi为什么不干脆HashSet
?@veer:我需要保持秩序。如此使用LinkedHashSet@MohammodHossain否,LinkedHashSet
是正确的选择,因为它将保留元素顺序。如果没有空元素;)是,但95%的集合没有。已有一个谓词.notNull()
谓词可用。因此最终结果将是copyOf(filter(list,notNull())).asList()代码>@Jonas true。但是在我写这篇文章的时候,这个方法并不存在。请注意,set.add仅在元素实际添加时才返回true,因此不需要调用set.contains。
copyOf(filter(list, not(isNull()))).asList();
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;
}
}