Tengo una matriz de objetos que necesitan eliminar o filtrar los duplicados. Iba a sobrescribir igual a & hachCode en los elementos del objeto, y luego pegarlos en un conjunto ... pero pensé que debería al menos sondear stackoverflow para ver si había otra forma, tal vez algún método inteligente de alguna otra API ?¿Cuál es la mejor manera de eliminar duplicados en una matriz en Java?
Respuesta
Estoy de acuerdo con su enfoque para anular hashCode()
y equals()
y usar algo que implemente Set
.
Hacerlo también deja absolutamente en claro para cualquier otro desarrollador que se requiere la característica de no duplicar.
Otra razón - que llegar a elegir una implementación que se adapte a sus necesidades mejor ahora:
y usted no tiene que cambiar su código para cambiar la implementación en el futuro.
A Set
es definitivamente su mejor apuesta. La única manera de eliminar elementos de una matriz (sin crear uno nuevo) es anularlos, y luego terminará con muchos controles nulos más adelante.
Reemplazando equals
y hashCode
y creando un conjunto fue mi primer pensamiento también. Es una buena práctica tener alguna versión anulada de estos métodos de todos modos en su jerarquía de herencia.
Yo creo que si se utiliza un LinkedHashSet
incluso se va a preservar el orden de los elementos únicos ...
Sí, 'LinkedHashSet' mantendrá el orden de inserción. –
No es una buena práctica anular equals y hashCode "de todos modos", especialmente en cualquier clase que se sitúe en una jerarquía de herencia. Vea Java efectivo (Bloch) para más. – McDowell
McDowell, me wa no muy claro - que quería decir que no debe haber una versión sustituida * * algún lugar en la jerarquía de herencia, y he modificado la respuesta a reflejar eso. No tengo una copia de Java efectivo: ¿es esto a lo que está apuntando Bloch? –
encontré esto en la web
Aquí son dos métodos que le permiten eliminar los duplicados en una ArrayList. removeDuplicate no mantiene el orden donde removeDuplicateWithOrder mantiene el orden con algunos gastos generales de rendimiento.
El Método removeDuplicate:
/** List order not maintained **/ public static void removeDuplicate(ArrayList arlList) { HashSet h = new HashSet(arlList); arlList.clear(); arlList.addAll(h); }
El Método removeDuplicateWithOrder:
/** List order maintained **/ public static void removeDuplicateWithOrder(ArrayList arlList) { Set set = new HashSet(); List newList = new ArrayList(); for (Iterator iter = arlList.iterator(); iter.hasNext();) { Object element = iter.next(); if (set.add(element)) newList.add(element); } arlList.clear(); arlList.addAll(newList); }
Buena respuesta, pero su segundo ejemplo no está en un bloque de formato de código – TravisO
gracias a Ken G ...Lo intenté un par de veces pero no pude solucionar el segundo código de blog –
LinkedHashSet lo mantiene en orden. Eso puede optimizarlo aún más. –
Hablando desde un estándar de programación general siempre se puede enumerar el doble de las colecciones entonces el comparar la fuente y objetivo
Y si su enumeración interior siempre se inicia después de una entrada de la fuente, es bastante eficiente (pseudo código para seguir)
foreach (array as source)
{
// keep track where we are in the array
place++;
// loop the array starting at the entry AFTER the current one we are comparing to
for (i=place+1; i < max(array); i++)
{
if (source === array[place])
{
destroy(array[i]);
}
}
}
Se podría añadir sin duda un descanso; declaración después de la destrucción, pero luego solo descubres el primer duplicado, pero si eso es todo lo que tendrás, entonces sería una buena optimización pequeña.
me gustaría reiterar el argumento de Jason en los comentarios:
Por qué coloque a sí mismo en ese punto en absoluto?
¿Por qué utilizar una matriz de una estructura de datos que no deberían contener duplicados en absoluto?
Use Set
o SortedSet
(cuando los elementos tienen un orden natural también) en todo momento para contener los elementos. Si necesita mantener el orden de inserción, puede usar el LinkedHashSet
como se ha señalado.
Tener a post-proceso de alguna estructura de datos es a menudo un indicio de que debería haber elegido una diferente, para empezar.
Estoy de acuerdo con todos los comentarios sobre las preocupaciones de que la estructura de datos inicial sea una matriz. Intento presionar al desarrollador para que refactorice a un conjunto. ¡Gracias a todos por sus comentarios y sabiduría! – Liggy
Por supuesto el post original plantea la pregunta: "¿Cómo se obtiene esa matriz (que puede contener entradas duplicadas) en el primer lugar?"
¿Necesita la matriz (con duplicados) para otros fines, o puede simplemente usar un juego desde el principio?
Alternativamente, si usted necesita saber el número de ocurrencias de cada valor, se puede utilizar un Map<CustomObject, Integer>
para rastrear conteos. Además, la definición Google Collections de las clases Multimap puede ser útil.
Básicamente, desea una implementación LinkedHashSet<T>
que admita la interfaz List<T>
para acceso aleatorio. Por lo tanto, esto es lo que necesita:
public class LinkedHashSetList<T> extends LinkedHashSet<T> implements List<T> {
// Implementations for List<T> methods here
...
}
La aplicación de los métodos List<T>
podría acceder y manipular el LinkedHashSet<T>
subyacente. El truco es tener esta clase se comportan correctamente cuando se intenta añadir duplicados a través de los List<T>
añadir métodos (lanzando una excepción o volver a añadir el artículo a un índice diferente sería opciones: que se puede elegir uno de o hacer configurable por los usuarios de la clase).
Esto es lo que sugiero, también. –
utilizar una lista toRemove
para grabar elemento en la primera vez iterator
tropiezo en él, después, cuando se reúnen de nuevo con el elemento registrado, y eliminar el uso de iterator.remove()
private void removeDups(List list) {
List toRemove = new ArrayList();
for(Iterator it = list.iterator(); it.hasNext();) {
Object next = it.next();
if(!toRemove.contains(next)) {
toRemove.add(next);
} else {
it.remove();
}
}
toremove.clear();
}
- 1. Java ¿Quieres eliminar duplicados de una matriz?
- 2. ¿cuál es la mejor manera de verificar una matriz vacía?
- 3. ¿Cuál es la mejor manera de eliminar elementos de matriz en PHP?
- 4. ¿Cuál es la mejor manera de eliminar el primer elemento de una matriz?
- 5. ¿Cuál es la mejor manera de dibujar en la consola?
- 6. Eliminar duplicados de una matriz de enteros grandes utilizando Java
- 7. ¿Cuál es la mejor manera de serializar una matriz basada en una interfaz en WCF?
- 8. ¿Cuál es la mejor manera de eliminar acentos en una cadena unicode de Python?
- 9. ¿Cuál es la mejor manera de deducir una mesa?
- 10. ¿Cuál es la mejor manera de escribir una matriz corta [] en un archivo en C#?
- 11. PHP Eliminar duplicados de una matriz
- 12. VBA, eliminar duplicados de la matriz
- 13. La mejor manera de ordenar una matriz
- 14. ¿Cuál es una buena manera pitonica de encontrar objetos duplicados?
- 15. ¿Cuál es la mejor manera de eliminar toda una tabla grande en t-sql?
- 16. ¿Cuál es la mejor manera de crear una matriz de solo lectura en C#?
- 17. ¿Cuál es la mejor manera de crear una matriz de crecimiento dinámico en Scala?
- 18. La mejor manera de reorganizar un ArrayList en Java
- 19. ¿Cuál es la mejor manera de hacer bucles en JavaScript
- 20. ¿Cuál es la mejor manera de verificar si una cadena contiene una URL en Java/Android?
- 21. ¿Cuál es la mejor manera de crear una matriz dispersa en C++?
- 22. ¿Cuál es la mejor manera de contar la longitud absoluta de la matriz en JavaScript?
- 23. Cómo eliminar valores duplicados de una matriz en PHP
- 24. ¿Cuál es la inicialización predeterminada de una matriz en Java?
- 25. ¿Cuál es la mejor manera de escribir una aplicación de línea de comandos en Java?
- 26. ¿Cuál es la mejor manera de establecer todos los valores de una matriz tridimensional a cero en Java?
- 27. ¿Cuál es la mejor manera de crear una matriz secundaria a partir de una matriz existente en C++?
- 28. Java: la mejor manera de eliminar Javascript de HTML
- 29. Eliminar elementos duplicados de la matriz en Ruby
- 30. ¿Cuál es la mejor manera de conservar datos en una aplicación de escritorio Java?
Por qué colocarse en este lugar? ¿Por qué no prevenir los duplicados en primer lugar? – LeppyR64
Haga una pregunta sobre eliminar duplicados ... obtenga un montón de respuestas duplicadas. ¡La ironía! – erickson
lol @ erickson, ¡tan cierto! – Brabster