使用Guava从List中删除重复项

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几乎同样有效,并且不会抛出空值,万一你真的想要在你的集合中使用空值.)

  • _If_你没有null元素;) (3认同)
  • 没错,但95%的收藏集却没有。 (2认同)

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值都将从列表中丢失的事实.

  • 有一个`Predicates.notNull()`谓词已经可用.所以最终的结果是`copyOf(filter(list,notNull())).asList();`. (3认同)

jet*_*ton 7

与通用谓词

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)

  • 请注意,只有在实际添加元素时,set.add才返回true,因此不需要调用set.contains. (2认同)