Tengo un ArrayList<String>
, y quiero eliminar cadenas repetidas de él. ¿Cómo puedo hacer esto?
java
list
collections
arraylist
duplicates
usuario25778
fuente
fuente
public Set<Object> findDuplicates(List<Object> list) { Set<Object> items = new HashSet<Object>(); Set<Object> duplicates = new HashSet<Object>(); for (Object item : list) { if (items.contains(item)) { duplicates.add(item); } else { items.add(item); } } return duplicates; }
List
ySet
(en lugar de los tipos de implementaciónArrayList
yHashSet
como en su ejemplo).new HashSet(al)
lugar de inicializarlo para vaciarlo y llamarloaddAll
.Object
tiene varios valores si dos de ellos se repiten, los considero duplicados (otros valores pueden ser diferentes) y usoSet
.Si bien la conversión
ArrayList
a aHashSet
elimina eficazmente los duplicados, si necesita preservar el orden de inserción, prefiero sugerirle que use esta varianteLuego, si necesita recuperar una
List
referencia, puede usar nuevamente el constructor de conversión.fuente
En Java 8:
Tenga en cuenta que el contrato hashCode-equals para los miembros de la lista debe respetarse para que el filtrado funcione correctamente.
fuente
addAll
hacerlonew TreeSet<String>(String.CASE_INSENSITIVE_ORDER)
. El primer elemento agregado permanecerá en el conjunto, por lo que si su lista contiene "Perro" y "perro" (en ese orden)TreeSet
, contendrá "Perro". Si se debe preservar el orden, antes de la línea de la respuestalist.replaceAll(String::toUpperCase);
.Supongamos que tenemos una lista de me
String
gusta:Entonces podemos eliminar elementos duplicados de múltiples maneras.
Antes de Java 8
Nota: Si queremos mantener el orden de inserción, entonces debemos usar
LinkedHashSet
en lugar deHashSet
Usando guayaba
Usando Java 8
Nota: En caso de que queramos recopilar el resultado en una implementación de lista específica, por ejemplo
LinkedList
, podemos modificar el ejemplo anterior como:También podemos usarlo
parallelStream
en el código anterior, pero es posible que no proporcione los beneficios de rendimiento esperados. Mira esta pregunta para más.fuente
parallel streams
siempre obtendría un mejor rendimiento. Pero es un mito. Más tarde aprendí que hay ciertos escenarios en los que deberían usarse flujos paralelos. En este escenario, las secuencias paralelas no ofrecerán un mejor rendimiento. y sí, las secuencias paralelas pueden no dar los resultados deseados en algunos casos.List<String> deDupStringList3 = stringList.stream().map(String::toLowerCase).distinct().collect(Collectors.toList());
debería ser la solución adecuada en este casoSi no quieres duplicados, usa un Set en lugar de a
List
. Para convertir aList
aSet
puede usar el siguiente código:Si es realmente necesario, puede usar la misma construcción para convertir un
Set
respaldo en aList
.fuente
Set
no se puede usar aquí.También puede hacerlo de esta manera y preservar el orden:
fuente
Las secuencias Java 8 proporcionan una forma muy simple de eliminar elementos duplicados de una lista. Usando el método distinto. Si tenemos una lista de ciudades y queremos eliminar duplicados de esa lista, se puede hacer en una sola línea:
Cómo eliminar elementos duplicados de una lista de arrays
fuente
Aquí hay una manera que no afecta el orden de su lista:
l1 es la lista original, y l2 es la lista sin elementos repetidos (asegúrese de que YourClass tenga el método de igualdad de acuerdo con lo que desea representar para la igualdad)
fuente
ArrayList<T>
deben usarse en lugar deArrayList
) 2) La creación explícita de iteradores puede evitarse usando afor (T current : l1) { ... }
. Incluso si quisieras usarIterator
explícitamente,iterador
está mal escrito.Es posible eliminar duplicados de la lista de arrays sin usar HashSet o una lista de arrays más .
Prueba este código ...
La salida es
fuente
ImmutableSet.copyOf(lst).toList()
.indexOf
iteralst
utilizando un bucle for.También hay
ImmutableSet
de guayaba como opción ( aquí está la documentación):fuente
ImmutableSet.asList()
método, devolviendo unImmutableList
, si lo necesita de nuevo como aList
.Esto puede resolver el problema:
fuente
Probablemente un poco exagerado, pero disfruto este tipo de problema aislado. :)
Este código utiliza un conjunto temporal (para la verificación de unicidad) pero elimina elementos directamente dentro de la lista original. Dado que la eliminación de elementos dentro de una ArrayList puede inducir una gran cantidad de copia de matriz, se evita el método remove (int).
Mientras estamos en ello, aquí hay una versión para LinkedList (¡mucho mejor!):
Use la interfaz de marcador para presentar una solución unificada para List:
EDITAR: Supongo que las cosas genéricas realmente no agregan ningún valor aquí ... Oh, bueno. :)
fuente
fuente
Si está dispuesto a usar una biblioteca de terceros, puede usar el método
distinct()
en Eclipse Collections (anteriormente GS Collections).La ventaja de usar en
distinct()
lugar de convertir a un Conjunto y luego volver a una Lista es quedistinct()
conserva el orden de la Lista original, conservando la primera aparición de cada elemento. Se implementa mediante el uso de un conjunto y una lista.Si no puede convertir su Lista original en un tipo de Colecciones de Eclipse, puede usar ListAdapter para obtener la misma API.
Nota: Soy un committer para Eclipse Collections.
fuente
Estas tres líneas de código pueden eliminar el elemento duplicado de ArrayList o de cualquier colección.
fuente
Cuando esté completando ArrayList, use una condición para cada elemento. Por ejemplo:
Obtendremos una matriz {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
fuente
Si desea conservar su pedido, lo mejor es utilizar LinkedHashSet . Porque si desea pasar esta lista a una consulta de inserción al iterarla, el orden se conservará.
Prueba esto
Esta conversión será muy útil cuando desee devolver una Lista pero no un Conjunto.
fuente
Código:
Nota: Definitivamente, habrá sobrecarga de memoria.
fuente
fuente
LinkedHashSet hará el truco.
// salida: 5,1,2,3,4
fuente
fuente
Esto se usa para su lista de objetos personalizados
fuente
puede usar el bucle anidado de la siguiente manera:
fuente
Como se dijo anteriormente, debe usar una clase que implemente la interfaz Set en lugar de List para asegurarse de la unicidad de los elementos. Si tiene que mantener el orden de los elementos, se puede usar la interfaz SortedSet; la clase TreeSet implementa esa interfaz.
fuente
Si está utilizando el tipo de modelo Lista <T> / ArrayList <T>. Espero que sea de ayuda.
Aquí está mi código sin usar ninguna otra estructura de datos como set o hashmap
fuente
fuente
fuente
fuente
fuente
Si desea eliminar duplicados de ArrayList significa encontrar la siguiente lógica,
fuente