Tengo una lista de tipo Integer, por ejemplo:
[1, 1, 2, 3, 3, 3]
Me gustaría un método para devolver todos los duplicados, por ejemplo:
[1, 3]
¿Cuál es la mejor manera de hacer esto?
java
collections
mas fresco
fuente
fuente
Respuestas:
El método
add
deSet
devuelve un booleano si un valor ya existe (verdadero si no existe, falso si ya existe, consulte la documentación de Set ).Así que repite todos los valores:
fuente
for (Integer yourInt
, para evitar el boxeo y unboxing innecesarios, especialmente porque su entrada ya contieneInteger
s.HashSet
que también tenga que considerar el factor de carga, por ejemplo, cuando especifica una capacidad inicial de100
, porque desea agregar esa cantidad de elementos, se redondea a la siguiente potencia de 2 (128
), lo que implica que con el factor de carga predeterminado de0.75f
, el umbral de cambio de tamaño será96
, por lo que habrá un cambio de tamaño antes de agregar100
elementos. Afortunadamente, cambiar el tamaño ya no es tan caro. Con los JRE actualizados, el cambio de tamaño ya no es un refrito, los elementos simplemente se distribuyen entre sus dos posibles ubicaciones de resultados según el bit relevante.También necesitaba una solución para esto. Usé la solución de leifg y la hice genérica.
fuente
Tomé la solución de John Strickler y la rehice para usar la API de flujos introducida en JDK8:
fuente
distinct()
método integrado también tiene estado. No puedo pensar en una operación distinta eficiente (O (n)) que no tenga estado.Aquí hay una solución que usa Streams con Java 8
Solo mire si la frecuencia de este objeto está más de una vez en su lista. Luego llame a .distinct () para tener solo elementos únicos en su resultado
fuente
Collections::frequency
Está encendido). Es necesario revisar toda la colección para encontrar la frecuencia de un artículo. Y lo llamamos una vez para cada elemento de la colección, lo que hace estos fragmentosO(n^2)
. Notarás la diferencia en cualquier colección de más de un puñado de elementos. Nunca usaría esto en código real.solución base java 8:
fuente
Obviamente, puede hacer lo que quiera con ellos (es decir, poner un Conjunto para obtener una lista única de valores duplicados) en lugar de imprimir ... Esto también tiene la ventaja de registrar la ubicación de los elementos duplicados.
fuente
Usando Guava en Java 8
fuente
Esto también funciona:
fuente
Puedes usar algo como esto:
fuente
int
como tipo de variable aquí. Significa que para cada iteración, un entero se desempaqueta una vez y un int se coloca en una caja cuatro veces.Lambas podría ser una solución
fuente
Utilice un MultiMap para almacenar cada valor como un conjunto de clave / valor. Luego, recorra las claves en iteración y encuentre las que tengan varios valores.
fuente
Si usa Eclipse Collections , esto funcionará:
Actualización: a partir de Eclipse Collections 9.2 ahora puede usar
selectDuplicates
También puede usar colecciones primitivas para lograr esto:
Nota: Soy un comprometido con las colecciones de Eclipse.
fuente
fuente
Similar a algunas respuestas aquí, pero si desea encontrar duplicados basados en alguna propiedad:
fuente
crea a
Map<Integer,Integer>
, itera la lista, si un elemento está en el mapa, aumenta su valor, de lo contrario agrégalo al mapa con key = 1itera el mapa y agrega a las listas todos los elementos con key> = 2
fuente
Versión compacta generada de la respuesta principal, también se agregó un cheque vacío y un tamaño de conjunto preasignado:
fuente
tempSet
conlistSize
cuando sea necesario. Esta es una optimización menor, pero me gusta.Tomé la respuesta de Sebastian y le agregué un keyExtractor -
fuente
Una alternativa segura para subprocesos es esta:
fuente
Intente esto para encontrar elementos duplicados en la lista:
fuente
Esto debería funcionar para ordenados y sin clasificar.
fuente
Este es un problema donde brillan las técnicas funcionales. Por ejemplo, la siguiente solución de F # es más clara y menos propensa a errores que la mejor solución imperativa de Java (y trabajo a diario con Java y F #).
Por supuesto, esta pregunta es sobre Java. Entonces, mi sugerencia es adoptar una biblioteca que aporte características funcionales a Java. Por ejemplo, podría resolverse usando mi propia biblioteca de la siguiente manera (y hay varias otras que vale la pena ver también):
fuente
fuente
fuente
Este sería un buen método para encontrar valores duplicados, sin usar Set.
Y digamos que desea un método que le devuelva una lista distinta, es decir, si pasa una lista donde los elementos están ocurriendo más de una vez, obtendrá una lista con elementos distintos.
fuente
Y versión que usa el
commons-collections
CollectionUtils.getCardinalityMap
método:''
fuente
¿Qué tal este código?
fuente
por si acaso para aquellos que también quieran incluir tanto los duplicados como los no duplicados. Básicamente, la respuesta es similar a la respuesta correcta, pero en lugar de regresar de if not part, devuelve la otra parte
use este código (cambie al tipo que necesita)
fuente
Método más genérico como variante de https://stackoverflow.com/a/52296246
fuente
Si conoce el valor máximo (por ejemplo, <10000), podría sacrificar espacio por velocidad. No recuerdo el nombre exacto de esta técnica.
pseudo código:
fuente
Intenta esto:
Ejemplo si los valores de la lista son: [1, 2, 3, 4, 5, 6, 4, 3, 7, 8] elemento duplicado [3, 4].
fuente