Eliminar duplicados de una ArrayList

JavaJavaBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En Java, un ArrayList puede almacenar elementos duplicados. Si queremos eliminar los duplicados y solo mantener elementos únicos, tenemos que tomar pasos específicos. En este Laboratorio, aprenderemos cómo eliminar duplicados de un ArrayList de dos maneras: utilizando un HashSet y utilizando el método distinct() de Stream.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/FileandIOManagementGroup(["File and I/O Management"]) java(("Java")) -.-> java/ConcurrentandNetworkProgrammingGroup(["Concurrent and Network Programming"]) java(("Java")) -.-> java/DataStructuresGroup(["Data Structures"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java/DataStructuresGroup -.-> java/arrays("Arrays") java/DataStructuresGroup -.-> java/collections_methods("Collections Methods") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/user_input("User Input") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/arraylist("ArrayList") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/hashset("HashSet") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/generics("Generics") java/FileandIOManagementGroup -.-> java/stream("Stream") java/ConcurrentandNetworkProgrammingGroup -.-> java/working("Working") subgraph Lab Skills java/arrays -.-> lab-117445{{"Eliminar duplicados de una ArrayList"}} java/collections_methods -.-> lab-117445{{"Eliminar duplicados de una ArrayList"}} java/classes_objects -.-> lab-117445{{"Eliminar duplicados de una ArrayList"}} java/user_input -.-> lab-117445{{"Eliminar duplicados de una ArrayList"}} java/arraylist -.-> lab-117445{{"Eliminar duplicados de una ArrayList"}} java/hashset -.-> lab-117445{{"Eliminar duplicados de una ArrayList"}} java/generics -.-> lab-117445{{"Eliminar duplicados de una ArrayList"}} java/stream -.-> lab-117445{{"Eliminar duplicados de una ArrayList"}} java/working -.-> lab-117445{{"Eliminar duplicados de una ArrayList"}} end

Crear un ArrayList

Crea un ArrayList y agrega algunos elementos a él. Aquí hay un ejemplo:

import java.util.ArrayList;

public class RemoveDuplicates {
    public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        arrayList.add(1);
        arrayList.add(4);
        arrayList.add(2);
        System.out.println("ArrayList original: " + arrayList);
    }
}

Para ejecutar el código en la terminal, navega hasta el directorio que contiene el archivo y escribe el siguiente comando:

javac RemoveDuplicates.java && java RemoveDuplicates

Eliminar duplicados utilizando HashSet

Para eliminar duplicados utilizando un HashSet, primero crea un HashSet y pasa el ArrayList a su constructor. Dado que HashSet solo contiene elementos únicos, esto elimina todos los duplicados. Convierte el HashSet resultante de nuevo en un ArrayList.

import java.util.ArrayList;
import java.util.HashSet;

public class RemoveDuplicates {
    public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        arrayList.add(1);
        arrayList.add(4);
        arrayList.add(2);
        System.out.println("ArrayList original: " + arrayList);

        // Elimina duplicados
        HashSet<Integer> hashSet = new HashSet<>(arrayList);
        arrayList.clear();
        arrayList.addAll(hashSet);

        System.out.println("ArrayList con duplicados eliminados utilizando HashSet: " + arrayList);
    }
}

Eliminar duplicados utilizando el método distinct() de Stream

Para eliminar duplicados utilizando la API de Stream, primero utiliza el método stream() de ArrayList para crear un Stream. Luego utiliza el método distinct() para devolver un nuevo stream con elementos únicos. Finalmente, utiliza el método collect() para devolver los elementos del stream como un ArrayList.

import java.util.ArrayList;

public class RemoveDuplicates {
    public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        arrayList.add(1);
        arrayList.add(4);
        arrayList.add(2);
        System.out.println("ArrayList original: " + arrayList);

        // Elimina duplicados
        arrayList = (ArrayList<Integer>) arrayList.stream().distinct().collect(Collectors.toList());

        System.out.println("ArrayList con duplicados eliminados utilizando Stream: " + arrayList);
    }
}

Probar ambos enfoques

Para probar ambos enfoques, compila y ejecuta ambos ejemplos de código en la terminal.

javac RemoveDuplicates.java && java RemoveDuplicates

Crear una función

Para facilitar la eliminación de duplicados de múltiples ArrayLists en nuestro programa, podemos crear una función. Aquí hay un ejemplo:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.stream.Collectors;

public class RemoveDuplicates {
    public static void main(String[] args) {
        ArrayList<Integer> arrayList1 = new ArrayList<>();
        arrayList1.add(1);
        arrayList1.add(2);
        arrayList1.add(3);
        arrayList1.add(1);
        arrayList1.add(4);
        arrayList1.add(2);
        System.out.println("ArrayList original: " + arrayList1);

        ArrayList<Integer> arrayList2 = new ArrayList<>();
        arrayList2.add(5);
        arrayList2.add(6);
        arrayList2.add(1);
        arrayList2.add(7);
        arrayList2.add(5);
        System.out.println("ArrayList original: " + arrayList2);

        // Elimina duplicados utilizando HashSet
        removeDuplicatesUsingHashSet(arrayList1);
        removeDuplicatesUsingHashSet(arrayList2);

        // Elimina duplicados utilizando Stream
        removeDuplicatesUsingStream(arrayList1);
        removeDuplicatesUsingStream(arrayList2);

    }

    public static void removeDuplicatesUsingHashSet(ArrayList<Integer> arrayList) {
        HashSet<Integer> hashSet = new HashSet<>(arrayList);
        arrayList.clear();
        arrayList.addAll(hashSet);

        System.out.println("ArrayList con duplicados eliminados utilizando HashSet: " + arrayList);
    }

    public static void removeDuplicatesUsingStream(ArrayList<Integer> arrayList) {
        arrayList = (ArrayList<Integer>) arrayList.stream().distinct().collect(Collectors.toList());
        System.out.println("ArrayList con duplicados eliminados utilizando Stream: " + arrayList);
    }
}

Compilar y ejecutar

Para ejecutar el código en la terminal, navega hasta el directorio que contiene el archivo y escribe el siguiente comando:

javac RemoveDuplicates.java && java RemoveDuplicates

Modificar el tipo de datos

La función removeDuplicatesUsingHashSet() solo funciona para ArrayList<Integer>. Para hacer que la función sea más flexible, podemos modificar el tipo de datos a ArrayList<T>.

import java.util.ArrayList;
import java.util.HashSet;
import java.util.stream.Collectors;

public class RemoveDuplicates<T> {
    public static void main(String[] args) {
        ArrayList<Integer> arrayList1 = new ArrayList<>();
        arrayList1.add(1);
        arrayList1.add(2);
        arrayList1.add(3);
        arrayList1.add(1);
        arrayList1.add(4);
        arrayList1.add(2);
        System.out.println("ArrayList original: " + arrayList1);

        ArrayList<String> arrayList2 = new ArrayList<>();
        arrayList2.add("Hello");
        arrayList2.add("World");
        arrayList2.add("Java");
        arrayList2.add("Hello");
        arrayList2.add("Mars");
        System.out.println("ArrayList original: " + arrayList2);

        // Elimina duplicados utilizando HashSet
        removeDuplicatesUsingHashSet(arrayList1);
        removeDuplicatesUsingHashSet(arrayList2);

        // Elimina duplicados utilizando Stream
        removeDuplicatesUsingStream(arrayList1);
        removeDuplicatesUsingStream(arrayList2);

    }

    public static <T> void removeDuplicatesUsingHashSet(ArrayList<T> arrayList) {
        HashSet<T> hashSet = new HashSet<>(arrayList);
        arrayList.clear();
        arrayList.addAll(hashSet);

        System.out.println("ArrayList con duplicados eliminados utilizando HashSet: " + arrayList);
    }

    public static <T> void removeDuplicatesUsingStream(ArrayList<T> arrayList) {
        arrayList = (ArrayList<T>) arrayList.stream().distinct().collect(Collectors.toList());
        System.out.println("ArrayList con duplicados eliminados utilizando Stream: " + arrayList);
    }
}

Compilar y ejecutar la versión modificada

Para ejecutar el código en la terminal, navega hasta el directorio que contiene el archivo y escribe el siguiente comando:

javac RemoveDuplicates.java && java RemoveDuplicates

Agregar entrada del usuario

Para hacer que nuestro programa sea más interactivo, podemos permitir que el usuario ingrese los enteros que desea agregar a la ArrayList. Aquí hay un ejemplo:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
import java.util.stream.Collectors;

public class RemoveDuplicates<T> {
    public static void main(String[] args) {
        ArrayList<Integer> arrayList1 = new ArrayList<>();
        int input = getUserInput();
        while (input!= -1) {
            arrayList1.add(input);
            input = getUserInput();
        }
        System.out.println("ArrayList original: " + arrayList1);

        // Elimina duplicados utilizando HashSet
        removeDuplicatesUsingHashSet(arrayList1);

        // Elimina duplicados utilizando Stream
        removeDuplicatesUsingStream(arrayList1);

    }

    public static <T> void removeDuplicatesUsingHashSet(ArrayList<T> arrayList) {
        HashSet<T> hashSet = new HashSet<>(arrayList);
        arrayList.clear();
        arrayList.addAll(hashSet);

        System.out.println("ArrayList con duplicados eliminados utilizando HashSet: " + arrayList);
    }

    public static <T> void removeDuplicatesUsingStream(ArrayList<T> arrayList) {
        arrayList = (ArrayList<T>) arrayList.stream().distinct().collect(Collectors.toList());
        System.out.println("ArrayList con duplicados eliminados utilizando Stream: " + arrayList);
    }

    public static int getUserInput() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Ingrese un entero para agregar a la ArrayList, o -1 para salir: ");
        if (scanner.hasNextInt()) {
            return scanner.nextInt();
        }
        return -1;
    }
}

Compilar y ejecutar la versión final

Para ejecutar el código en la terminal, navega hasta el directorio que contiene el archivo y escribe el siguiente comando:

javac RemoveDuplicates.java && java RemoveDuplicates

Resumen

En este laboratorio, aprendimos cómo eliminar duplicados de una ArrayList de dos maneras: utilizando un HashSet y utilizando el método distinct() de Stream. También creamos una función para facilitar la eliminación de duplicados de múltiples ArrayList en nuestro programa, modificamos el tipo de datos para hacer la función más flexible y permitimos que el usuario ingrese los enteros que desea agregar a la ArrayList.