Eliminar duplicados de una Lista en Java

Vamos a ver dos formas fáciles de eliminar duplicados de una lista de objetos recogida por un servicio Java. Se trata de una funcionalidad bastante útil y a la cuál necesitaremos recurrir con cierta asiduidad en nuestro día a día en un proyecto Java. Por supuesto, existen métodos adicionales pero los que presentamos en el post nos deberían bastar para avanzar en nuestro trabajo.

 


 

Eliminar duplicados de una Lista en Java


Para llevar a cabo esta necesidad, vamos a presentar dos formas alternativas de implementación, una recurriendo al objeto HashSet y otra mediante el objeto LinkedHashSet.


Eliminar duplicados mediante HashSet


Para revisar esta implementación, vamos a partir de una lista de objetos (String) que contiene los nombres de varias empresas norteamericanas. El problema es que dentro de dicha lista hay varias compañías duplicadas y nosotros queremos quedarnos únicamente con una descripción única para cada empresa listada.

 

List<String> listaEntrada = new ArrayList(Arrays.asList("Asml Adr", "Broadcom", "Adobe",     "Astrazeneca Adr", "Amgen", "Applied Materials", "Airbnb", "Booking", "Analog             Devices", "Atlassian Corp Plc", "Asml Adr", "Applied Materials", "Analog Devices"));


Para eliminar duplicados, lo que haremos el volcar el listado anterior sobre un HashSet, que es una colección que no permite objetos duplicados. Y, a continuación, cargaremos el HashSet en una nueva lista de objetos de salida. De este modo, esta nueva lista final será igual a la lista de entrada pero sin contener los objetos duplicados.

La clase sería algo así:


// **************************************************

public class AppListaEliminarDuplicados {

 

      public static void main(String[] args) {

             // TODO Auto-generated method stub

 

             List<String> listaEntrada = new ArrayList(Arrays.asList("Asml Adr",                             "Broadcom", "Adobe", "Astrazeneca Adr", "Amgen", "Applied Materials",                      "Airbnb", "Booking", "Analog Devices", "Atlassian Corp Plc",  

                     "Asml Adr", "Applied Materials", "Analog Devices"));

               

            System.out.println("listaEntrada inicial: " + listaEntrada);

           

            List<String> listaSinDuplicados = new ArrayList<>();

           

            // Volcamos la lista inicial sobre un HashSet

            // Esto elimina los duplicados

            Set<String> set = new HashSet<>(listaEntrada);

           

            // Añadimos el HashSet sobre una lista

            // Ya tenemos una lista final sin duplicados

            listaSinDuplicados.addAll(set);

           

            System.out.println("listaSinDuplicados HashSet: " + listaSinDuplicados);

          

      }

 

}

// **************************************************

 

Si ejecutamos el anterior servicio, el resultado debería mostrarnos tanto la lista inicial con los objetos duplicados como la lista final sin objetos repetidos. La consola volcará algo así:

 

listaEntrada inicial: [Asml Adr, Broadcom, Adobe, Astrazeneca Adr, Amgen, Applied Materials, Airbnb, Booking, Analog Devices, Atlassian Corp Plc, Asml Adr, Applied Materials, Analog Devices]

listaSinDuplicados HashSet: [Amgen, Astrazeneca Adr, Booking, Airbnb, Adobe, Applied Materials, Atlassian Corp Plc, Analog Devices, Asml Adr, Broadcom]


Como vemos, el proceso ha eliminado los duplicados pero, eso sí, no ha conservado el orden inicial de las empresas: "Asml Adr", que originalmente estaba en primer lugar, ahora ha perdido esa posición privilegiada. Si, por necesidades del servicio, necesitamos conservar el orden de partida, entonces tendremos que recurrir al segundo método de eliminación que vamos a ver ahora.


Eliminar duplicados mediante LinkedHashSet


En este ejemplo vamos a partir de la misma lista inicial y nuestro objetivo va a ser el mismo. La diferencia es que ahora queremos conservar el orden que mostraban las empresas en el listado original.

 

List<String> listaEntrada = new ArrayList(Arrays.asList("Asml Adr", "Broadcom", "Adobe",     "Astrazeneca Adr", "Amgen", "Applied Materials", "Airbnb", "Booking", "Analog             Devices", "Atlassian Corp Plc", "Asml Adr", "Applied Materials", "Analog Devices"));


Para alcanzar la solución propuesta, tendremos que hacer uso del objeto LinkedHashSet. Lo que haremos el volcar el listado anterior sobre un LinkedHashSet, colección donde se eliminarán duplicados conservando la primera instancia encontrada. Y, a continuación, cargaremos el LinkedHashSet en una nueva lista de objetos de salida. De este modo, esta nueva lista final no contendrá objetos duplicados y habrá mantenido la ordenación original (es decir, se habrá mantenido únicamente la primera instancia de cada objeto).

La clase sería algo así:


// **************************************************

public class AppListaEliminarDuplicados {

 

      public static void main(String[] args) {

             // TODO Auto-generated method stub

 

             List<String> listaEntrada = new ArrayList(Arrays.asList("Asml Adr",                             "Broadcom", "Adobe", "Astrazeneca Adr", "Amgen", "Applied Materials",                      "Airbnb", "Booking", "Analog Devices", "Atlassian Corp Plc",  

                     "Asml Adr", "Applied Materials", "Analog Devices"));

               

            System.out.println("listaEntrada inicial: " + listaEntrada);


            List<String> listaSinDuplicados = new ArrayList<>();

           

            // Volcamos la lista inicial sobre un LinkedHashSet

            // Esto elimina los duplicados conservando el orden inicial

            Set<String> linked = new LinkedHashSet<>(listaEntrada);

           

            // Añadimos el LinkedHashSet sobre una lista

            // Ya tenemos una lista final sin duplicados

            listaSinDuplicados.addAll(linked);

           

            System.out.println("listaSinDuplicados LinkedHashSet: " +                                     listaSinDuplicados);

             

      }

 

}

// **************************************************

 

Si ejecutamos el anterior servicio, el resultado debería mostrarnos tanto la lista inicial con los objetos duplicados como la lista final sin objetos repetidos. La consola volcará algo así:


listaEntrada inicial: [Asml Adr, Broadcom, Adobe, Astrazeneca Adr, Amgen, Applied Materials, Airbnb, Booking, Analog Devices, Atlassian Corp Plc, Asml Adr, Applied Materials, Analog Devices]

listaSinDuplicados LinkedHashSet: [Asml Adr, Broadcom, Adobe, Astrazeneca Adr, Amgen, Applied Materials, Airbnb, Booking, Analog Devices, Atlassian Corp Plc]


Como vemos, la lista final contiene las empresas sin objetos duplicados. Pero, a diferencia del ejemplo anterior, ahora las empresas han conservado la misma posición que tenían en la lista original


Pues nada, estos son los dos métodos que os quería presentar hoy aquí para ejecutar una eliminación de repetidos dentro de una lista de objetos. Con estas dos variantes ya tenéis más que suficiente para ir completando la implementación de los diferentes servicios dentro de vuestro proyecto. Por cierto, si os queda alguna duda, podéis dejarla aquí abajo.


 Saludos.


Comentarios

Entradas populares de este blog

Componentes y Ventanas de Java Swing

Creación de Webservice SOAP básico

Fichero standalone del Servidor JBoss EAP