Eliminar duplicados de la Lista usando Guayaba


¿Cómo podemos eliminar duplicados de la Lista 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));
}
Author: Priyank Doshi, 2012-09-03

6 answers

Probablemente la forma más eficiente es ImmutableSet.copyOf(list).asList(), que elimina duplicados y preserva el orden de iteración.

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

 67
Author: Louis Wasserman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-03 21:09:49

Me encantaLa 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 las que null ocurre. Aquí hay una versión a prueba de nulos un poco más larga:

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

O, con importaciones estáticas:

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

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

 12
Author: Sean Patrick Floyd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:44

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

}
 7
Author: jeton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-14 11:53:14

Si quieres usar guayaba a cualquier precio puedes hacer

return new ArrayList<T>(HashMultiSet<T>.create(list).elementSet())
 1
Author: halex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-03 04:57:22

Realmente no recomiendo usar (Linked)HashMultiSet para hacer la tarea 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 todos estos <T> s:

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

Sin embargo, puede hacerlo en más "forma de guayaba": evitando nulos y usando colecciones inmutables.

Así que si su colección no puede tener elementos nulos, yo sugeriría usar conjunto inmutable en lugar de 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 completamente inmutable y cambiar 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 manera solo hay una copia involucrada, porque ImmutableCollection.asList() devuelve una vista.

 1
Author: Xaerxess,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-03 11:31:08

Puede probar la API MultiSet de Guayaba para eliminar duplicados.Simplemente agregue su lista haga el conjunto y use el método count.

MultiSet

 0
Author: UVM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-15 04:52:45