Hace tiempo un amigo me preguntaba como podía eliminar los elementos repetidos de una colección sin hacer mucho esfuerzo.
Bien la solución que considero mucho mas rápida es con ayuda de una HashMap ya que al no permitir elementos repetidos como llave nos ayuda a descartar de forma muy rápida los elementos que ya tenemos en nuestra colección.
Imagines un escenario donde tenemos una lista de clase Cliente la cual tiene un campo de ID que nos ayude a identificarlo como único, Con esto lo único que tendríamos que hacer es meter como llave el ID y como Valor el Objecto Cliente completo. Al terminar de introducir todos los elementos los elementos repetidos serán automáticamente descartados y solo faltaría iterar las Entradas del HashMap para recuperar los valores únicos.
Veamos el siguiente Código:
Para los que no les quedo muy claro como el Map elimina los repetidos les explico:
Los Map tiene la característica de tener por cada entrada dos elementos el Key y el Value, El Key representa un elemento único y no puedo contener repetidos por lo que si se intenta meter un elemento repetido lo que hará es sustituir este ultimo por que estaba antes y el Value representa un valor cualquiera asociado a la llave o Key.
Yo opino que con un java.util.Set es más sencillo… una de sus características principales es que no contiene elementos duplicados http://docs.oracle.com/javase/7/docs/api/java/util/Set.html, lo único que tienes que implementar es el método equals y hashCode de la clase Persona, así el filtro se realiza de forma transparente
Hola Edgar, Efectivamente esta método es totalmente valido y podría ser incluso hasta mejor si podemos sobre escribir el método HashCode e Equals, Sin embargo existe un pequeño tema por el cual me inclino mas por este método y es que los set para comprobar si un elemento ya existe en la colección usa un Algoritmo Iterativo por lo cual tendrá que recorrer elemento por elemento y comprar si ya existe en la lista, Sin embargo los Map utilizan un algoritmo Hash el cual es mucho mas rápido que un algoritmo Iterativo y no requiere modificar la clase solo para que funcione en el ordenamiento.
Saludos.
Lo hace de forma iterativa pero sobre el hashcode, de hecho muy similar a lo que hace el hashmap, cumpliendo con una complejidad nlog(n) lo que lo hace igual de eficiente.
Saludos.
Podría ser casi igual sin embargo el algoritmo Hash es mucho mas rápido a medida que vamos agregando mas y mas elementos a la colección en comparación que el iterativo
Las diferencias ni siquiera son considerables (el HashSet usa un HashMap internamente) y el enfoque que propones, aplica únicamente en el caso de que tus objetos tienen un ID, es decir un HashMap esta diseñado para almacenar pares de información (key-value) a diferencia del HashSet… el foco de tu solución debería estar en que el diseño sea claro y sencillo, más allá de preocuparte por micro-optimizaciones
Nuevamente son solo opiniones ya cada quien tomara sus conclusiones. el detalle aquí planteado es funcional y no requiere de ninguna modificación a las clases existentes.
implementar tanto el método equals como el hashcode es considerado como una buena practica, no es modificar una clase, me queda claro que son opiniones. Las mías también son opiniones acerca de cuales deberían ser los “concerns” al momento de dar una solución y creo que lo principal es enfocarse en que el diseño sea claro y sencillo más allá de buscar una micro-optimización
gracias, realmente funcional
Gracias por el comentario Sebastian
con esta sentencia es las fácil, si tienes java 8
.stream().distinct().collect(Collectors.toList());
Toma en cuenta que sin un comparator, ese método puede no ser efectivo, pues se compararan por el metodo equals y hay objetos que para comprobar si igualdad es necesario tomar en cuenta algún atributo.