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));
}
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.)
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.
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;
}
}
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())
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.
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.
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