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.
Crear una 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 de 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.



