Comment pouvons-nous supprimer les doublons de la liste à l'aide de Guava api?
Actuellement, je suis ceci:
private List<T> removeDuplicate(List<T> list){
return new ArrayList<T>(new LinkedHashSet<T>(list));
}
Le moyen le plus efficace est probablement ImmutableSet.copyOf(list).asList()
, qui élimine les doublons et préserve l'ordre d'itération.
(Mais votre implémentation avec LinkedHashSet
serait presque aussi efficace, et ne renoncerait pas à des valeurs nulles, dans le cas peu probable où vous vouliez réellement des valeurs nulles dans votre collection.)
J'adore réponse de Louis pour sa simplicité (et parce que c'est la seule réponse qui ne nécessite pas 2 itérations complètes), mais malheureusement dans le monde réel, vous rencontrez souvent des situations où null
se produit. Voici une version null-safe légèrement plus longue:
ImmutableSet.copyOf(
Iterables.filter(
list, Predicates.not(Predicates.isNull()))).asList();
Ou, avec des importations statiques:
copyOf(filter(list, not(isNull()))).asList();
Bien sûr, vous devez être conscient du fait que toutes les valeurs null
seront perdues de la liste.
avec prédicat générique
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;
}
}
Si vous voulez utiliser la goyave à tout prix, vous pouvez le faire
return new ArrayList<T>(HashMultiSet<T>.create(list).elementSet())
Je ne recommande vraiment pas d'utiliser (Linked)HashMultiSet
Pour effectuer des tâches qui sont généralement effectuées avec ArrayList
et (Linked)HashSet
Comme OP mentionné ci-dessus - il est moins lisible pour les Java programmeur et (probablement) moins efficace.
Au lieu de cela, utilisez au moins des constructeurs d'usine statiques comme newArrayList
et newLinkedHashSet
pour éviter tous ces <T>
S:
private static <T> List<T> removeDuplicate(final List<T> list) {
return Lists.newArrayList(Sets.newLinkedHashSet(list));
}
Cependant, vous pouvez le faire de manière plus "goyave" - en en évitant les valeurs nulles et en utilisant collections immuables .
Donc, si votre collection ne peut pas avoir des éléments nuls, je suggère d'utiliser ensemble immuable au lieu de mutable et moins efficace :
private static <T> List<T> removeDuplicate(final List<T> list) {
return Lists.newArrayList(ImmutableSet.copyOf(list));
}
Il copie toujours des objets deux fois, alors envisagez d'être totalement immuable et de changer la signature de la méthode pour renvoyer ImmutableList
:
private static <T> ImmutableList<T> removeDuplicate(final List<T> list) {
return ImmutableSet.copyOf(list).asList();
}
De cette façon, il n'y a qu'une seule copie impliquée, car ImmutableCollection.asList()
renvoie une vue.
Vous pouvez essayer l'API MultiSet de Guava pour supprimer les doublons.Ajoutez simplement votre liste à l'ensemble et utilisez la méthode de comptage.