web-dev-qa-db-ja.com

グアバを使用してリストから重複を削除する

Guava apiを使用して、リストから重複を削除するにはどうすればよいですか?

現在、私はこれをフォローしています:

private List<T> removeDuplicate(List<T> list){
return new ArrayList<T>(new LinkedHashSet<T>(list));
}
34
Priyank Doshi

おそらく最も効率的な方法はImmutableSet.copyOf(list).asList()です。これは重複を排除し、反復順序を保持します。

(ただし、LinkedHashSetを使用した実装はほぼ効率的であり、コレクションで実際にnullが必要になることはほとんどありませんが、nullをスローしません。)

69
Louis Wasserman

私は Louis 'answer が大好きです(そしてそれが2回の完全な反復を必要としない唯一の答えだからです)が、残念ながら現実の世界ではnullが発生します。以下は、少し長いnullセーフバージョンです。

ImmutableSet.copyOf(
    Iterables.filter(
        list, Predicates.not(Predicates.isNull()))).asList();

または、静的インポートの場合:

copyOf(filter(list, not(isNull()))).asList();

もちろん、すべてのnull値がリストから失われるという事実に注意する必要があります。

12

汎用述語付き

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

}
7
jeton

あなたができる価格でグアバを使いたいなら

return new ArrayList<T>(HashMultiSet<T>.create(list).elementSet())
1
halex

上記のOPのような通常ArrayListと_(Linked)HashMultiSet_で行われるタスクを行うために_(Linked)HashSet_を使用することは本当にお勧めしません-通常のJavaプログラマーにとっては読みにくいですおよび(おそらく)効率が低下します。

代わりに、少なくとも newArrayList および newLinkedHashSet などの静的ファクトリコンストラクタを使用します。これらすべての_<T>_ sを回避するには:

_private static <T> List<T> removeDuplicate(final List<T> list) {
  return Lists.newArrayList(Sets.newLinkedHashSet(list));
}
_

ただし、「= nulls を回避し、 immutable collections を使用する」というより「グアバ方式」で行うことができます。

したがって、コレクションcannotにnull要素がある場合、代わりに immutable set を使用することをお勧めします mutableで効率の悪いもの

_private static <T> List<T> removeDuplicate(final List<T> list) {
  return Lists.newArrayList(ImmutableSet.copyOf(list));
}
_

まだオブジェクトを2回コピーしているので、完全に不変であり、メソッドシグネチャを変更してImmutableListを返すことを検討してください。

_private static <T> ImmutableList<T> removeDuplicate(final List<T> list) {
  return ImmutableSet.copyOf(list).asList();
}
_

ImmutableCollection.asList() はビューを返すため、この方法では、1つのコピーのみが関係します。

1
Xaerxess

GuavaのMultiSet APIを使用して重複を削除できます。リストを追加して設定を行い、countメソッドを使用します。

マルチセット

0
UVM