Java 使用番石榴从列表中删除重复项

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

我们如何在番石榴api的帮助下从列表中删除重复项

目前,我正在关注以下内容:

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;
    }

}