¿Cómo podría detectar (devolver verdadero / falso) si una ArrayList contiene más de uno del mismo elemento en Java?
Muchas gracias Terry
Editar Olvidé mencionar que no estoy buscando comparar "Bloques" entre sí, sino sus valores enteros. Cada "bloque" tiene un int y esto es lo que los hace diferentes. Encuentro el int de un Bloque en particular llamando a un método llamado "getNum" (por ejemplo, table1 [0] [2] .getNum ();
Respuestas:
Lo más simple: volcar toda la colección en un Conjunto (usando el constructor Set (Colección) o Set.addAll), luego ver si el Conjunto tiene el mismo tamaño que ArrayList.
Actualización: si entiendo su pregunta correctamente, tiene una matriz 2d de Block, como en
Tabla de bloques [] [];
y quieres detectar si alguna fila de ellos tiene duplicados?
En ese caso, podría hacer lo siguiente, asumiendo que Block implementa "equals" y "hashCode" correctamente:
No estoy 100% seguro de eso para la sintaxis, por lo que sería más seguro escribirlo como
Set.add
devuelve un booleano falso si el elemento que se está agregando ya está en el conjunto, por lo que incluso podría hacer un cortocircuito y descartar cualquier adición que devuelvafalse
si todo lo que desea saber es si hay duplicados.fuente
Código mejorado, usando el valor de retorno de en
Set#add
lugar de comparar el tamaño de la lista y el conjunto.fuente
Set<T> set = new HashSet<T>(list.size());
? Dado un parámetro de lista, creo que es más eficiente si es común que la lista no contenga duplicados.HashSet
tamaño de la lista, se cambiará el tamaño cuando se recorra toda la lista debido al factor de carga subyacente de la estructura hash.Si está buscando evitar tener duplicados, entonces debe cortar el proceso intermedio de detección de duplicados y usar un Conjunto .
fuente
Código mejorado para devolver los elementos duplicados.
fuente
Si sus elementos son de alguna manera Comparables (el hecho de que el orden tenga un significado real es indiferente, solo debe ser consistente con su definición de igualdad), la solución de eliminación de duplicados más rápida será ordenar la lista (0 (n log ( n))) luego hacer una sola pasada y buscar elementos repetidos (es decir, elementos iguales que se suceden) (esto es O (n)).
La complejidad general será O (n log (n)), que es aproximadamente la misma que obtendría con un Conjunto (n veces largo (n)), pero con una constante mucho menor. Esto se debe a que la constante en ordenar / deducir resulta del costo de comparar elementos, mientras que el costo del conjunto es más probable que resulte de un cálculo hash, más una (posiblemente varias) comparaciones hash. Si está utilizando una implementación de conjunto basada en hash, es decir, porque una basada en árbol le dará un O (n log² (n)), que es incluso peor.
Sin embargo, según tengo entendido, no es necesario eliminar los duplicados, sino simplemente probar su existencia. Por lo tanto, debe codificar manualmente un algoritmo de combinación o clasificación de montón en su matriz, que simplemente sale devolviendo verdadero (es decir, "hay un dup") si su comparador devuelve 0, y de lo contrario completa la clasificación, y atraviesa la prueba de matriz ordenada para repeticiones . En una combinación o clasificación de pila, de hecho, cuando se complete la clasificación, habrá comparado cada par duplicado a menos que ambos elementos ya estuvieran en sus posiciones finales (lo cual es poco probable). Por lo tanto, un algoritmo de clasificación modificado debería producir una gran mejora en el rendimiento (tendría que demostrar eso, pero supongo que el algoritmo modificado debería estar en O (log (n)) en datos uniformemente aleatorios)
fuente
Necesitaba hacer una operación similar para a
Stream
, pero no pude encontrar un buen ejemplo. Esto es lo que se me ocurrió.Esto tiene la ventaja de producir un cortocircuito cuando los duplicados se encuentran temprano en lugar de tener que procesar todo el flujo y no es mucho más complicado que simplemente poner todo en un
Set
y verificar el tamaño. Entonces este caso sería aproximadamente:fuente
Con Java 8+ puede utilizar Stream API:
fuente
En pocas palabras: 1) asegúrese de que todos los elementos sean comparables 2) ordene la matriz 2) repita la matriz y encuentre duplicados
fuente
Para conocer los Duplicados en una Lista use el siguiente código: Le dará el conjunto que contiene los duplicados.
fuente
La mejor manera de manejar este problema es usar un HashSet :
Simplemente imprima la lista de matrices de resultados y vea el resultado sin duplicados :)
fuente
Si desea el conjunto de valores duplicados:
Y probablemente también piense en recortar valores o usar minúsculas ... según su caso.
fuente
Nota: esto tendrá un gran impacto en el rendimiento, ya que los elementos se eliminan del inicio de la lista. Para abordar esto, tenemos dos opciones. 1) iterar en orden inverso y eliminar elementos. 2) Utilice LinkedList en lugar de ArrayList. Debido a las preguntas sesgadas que se hacen en las entrevistas para eliminar los duplicados de la Lista sin usar ninguna otra colección, el ejemplo anterior es la respuesta. Sin embargo, en el mundo real, si tengo que lograr esto, pondré elementos de List en Set, ¡simple!
fuente
Un ejemplo de una clase concreta que se ha anulado
equals()
:fuente
fuente
Esta respuesta está escrita en Kotlin, pero se puede traducir fácilmente a Java.
Si el tamaño de su lista de arrays está dentro de un rango pequeño fijo, entonces esta es una gran solución.
fuente
fuente