Java – Como eliminar rápidamente elementos repetidos de una colección

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.

Curso de Java Core
Te invito a que veas mi curso de Java Core, en el cual enseñamos Java desde cero con las mejores prácticas y un proyecto final.

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:

codigo

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.

11 thoughts to “Java – Como eliminar rápidamente elementos repetidos de una colección”

    1. 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.

      1. 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.

  1. 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

      1. 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

    1. 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.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *