Guava apiを使用して、リストから重複を削除するにはどうすればよいですか?
現在、私はこれをフォローしています:
private List<T> removeDuplicate(List<T> list){
return new ArrayList<T>(new LinkedHashSet<T>(list));
}
おそらく最も効率的な方法はImmutableSet.copyOf(list).asList()
です。これは重複を排除し、反復順序を保持します。
(ただし、LinkedHashSet
を使用した実装はほぼ効率的であり、コレクションで実際にnullが必要になることはほとんどありませんが、nullをスローしません。)
私は Louis 'answer が大好きです(そしてそれが2回の完全な反復を必要としない唯一の答えだからです)が、残念ながら現実の世界ではnull
が発生します。以下は、少し長い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;
}
}
あなたができる価格でグアバを使いたいなら
return new ArrayList<T>(HashMultiSet<T>.create(list).elementSet())
上記の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つのコピーのみが関係します。
GuavaのMultiSet APIを使用して重複を削除できます。リストを追加して設定を行い、countメソッドを使用します。