una sean repetidos que para numeros los lista iguales enlazada eliminar elementos duplicados datos caracteres cadena arreglo algoritmo java list generics arraylist guava

java - sean - Eliminar duplicados de la lista usando guayaba



eliminar los elementos que sean iguales a 6 en un arraylist (6)

¿Cómo podemos eliminar duplicados de List con la ayuda de Guava api ?

Actualmente estoy siguiendo esto:

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


Me encanta la respuesta de Louis por su simplicidad (y porque es la única respuesta que no requiere 2 iteraciones completas), pero desafortunadamente en el mundo real, a menudo te encuentras con situaciones en null que ocurre null . Aquí hay una versión null-safe un poco más larga:

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

O bien, con importaciones estáticas:

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

Por supuesto, debe tener en cuenta el hecho de que todos null Valores null se perderán de la Lista.


Probablemente, la forma más eficiente es ImmutableSet.copyOf(list).asList() , que elimina los duplicados y conserva el orden de las iteraciones.

(Pero su implementación con LinkedHashSet sería casi tan eficiente, y no vomitaría en nulos, en el improbable caso de que realmente quisiera nulos en su colección).


Puede probar la API MultiSet de Guava para eliminar duplicados. Solo agregue su lista, haga el conjunto y use el método de recuento.

MultiSet


Realmente no recomiendo usar (Linked)HashMultiSet para hacer tareas que generalmente se hace con ArrayList y (Linked)HashSet como OP mencionado anteriormente - es menos legible para el programador Java regular y (probablemente) menos eficiente.

En su lugar, al menos use constructores de fábrica estáticos como newArrayList y newLinkedHashSet para evitar todas estas <T> s:

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

Sin embargo, puedes hacerlo de más "manera Guava" - evitando nulos y usando colecciones inmutables .

Entonces, si su colección no puede tener elementos nulos, sugiero usar un conjunto inmutable en lugar de uno mutable y menos eficiente :

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

Todavía está copiando objetos dos veces, así que considere ser totalmente inmutable y cambie la firma del método para devolver ImmutableList :

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

De esta forma, solo hay una copia involucrada, porque ImmutableCollection.asList() devuelve una vista.


Si quieres usar guayaba a cualquier precio, puedes hacer

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


con predicado genérico

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