Introdução
Em Java, um ArrayList pode armazenar elementos duplicados. Se quisermos remover as duplicatas e manter apenas elementos únicos, precisamos tomar medidas específicas. Neste Lab, aprenderemos como remover duplicatas de um ArrayList de duas maneiras: usando um HashSet e usando o método distinct() de Stream.
Criar um ArrayList
Crie um ArrayList e adicione alguns elementos a ele. Aqui está um exemplo:
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("Original ArrayList: " + arrayList);
}
}
Para executar o código no terminal, navegue até o diretório que contém o arquivo e insira o seguinte comando:
javac RemoveDuplicates.java && java RemoveDuplicates
Remover duplicatas usando HashSet
Para remover duplicatas usando um HashSet, primeiro crie um HashSet e passe o ArrayList para seu construtor. Como HashSet contém apenas elementos únicos, isso elimina todas as duplicatas. Converta o HashSet resultante de volta para um 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("Original ArrayList: " + arrayList);
// Remove duplicates
HashSet<Integer> hashSet = new HashSet<>(arrayList);
arrayList.clear();
arrayList.addAll(hashSet);
System.out.println("ArrayList with duplicates removed using HashSet: " + arrayList);
}
}
Remover duplicatas usando o método distinct() de Stream
Para remover duplicatas usando a API Stream, primeiro use o método stream() de ArrayList para criar um Stream. Em seguida, use o método distinct() para retornar um novo stream com elementos distintos. Finalmente, use o método collect() para retornar os elementos do stream como um 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("Original ArrayList: " + arrayList);
// Remove duplicates
arrayList = (ArrayList<Integer>) arrayList.stream().distinct().collect(Collectors.toList());
System.out.println("ArrayList with duplicates removed using Stream: " + arrayList);
}
}
Testar Ambas as Abordagens
Para testar ambas as abordagens, compile e execute ambos os exemplos de código no terminal.
javac RemoveDuplicates.java && java RemoveDuplicates
Criar uma Função
Para facilitar a remoção de duplicatas de múltiplos ArrayLists em nosso programa, podemos criar uma função. Aqui está um exemplo:
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("Original ArrayList: " + arrayList1);
ArrayList<Integer> arrayList2 = new ArrayList<>();
arrayList2.add(5);
arrayList2.add(6);
arrayList2.add(1);
arrayList2.add(7);
arrayList2.add(5);
System.out.println("Original ArrayList: " + arrayList2);
// Remove duplicates using HashSet
removeDuplicatesUsingHashSet(arrayList1);
removeDuplicatesUsingHashSet(arrayList2);
// Remove duplicates using 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 with duplicates removed using HashSet: " + arrayList);
}
public static void removeDuplicatesUsingStream(ArrayList<Integer> arrayList) {
arrayList = (ArrayList<Integer>) arrayList.stream().distinct().collect(Collectors.toList());
System.out.println("ArrayList with duplicates removed using Stream: " + arrayList);
}
}
Compilar e Executar
Para executar o código no terminal, navegue até o diretório que contém o arquivo e insira o seguinte comando:
javac RemoveDuplicates.java && java RemoveDuplicates
Modificar Tipo de Dados
A função removeDuplicatesUsingHashSet() funciona apenas para ArrayList<Integer>. Para tornar a função mais flexível, podemos modificar o tipo de dados para 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("Original ArrayList: " + arrayList1);
ArrayList<String> arrayList2 = new ArrayList<>();
arrayList2.add("Hello");
arrayList2.add("World");
arrayList2.add("Java");
arrayList2.add("Hello");
arrayList2.add("Mars");
System.out.println("Original ArrayList: " + arrayList2);
// Remove duplicates using HashSet
removeDuplicatesUsingHashSet(arrayList1);
removeDuplicatesUsingHashSet(arrayList2);
// Remove duplicates using 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 with duplicates removed using HashSet: " + arrayList);
}
public static <T> void removeDuplicatesUsingStream(ArrayList<T> arrayList) {
arrayList = (ArrayList<T>) arrayList.stream().distinct().collect(Collectors.toList());
System.out.println("ArrayList with duplicates removed using Stream: " + arrayList);
}
}
Compilar e Executar a Versão Modificada
Para executar o código no terminal, navegue até o diretório que contém o arquivo e insira o seguinte comando:
javac RemoveDuplicates.java && java RemoveDuplicates
Adicionar Entrada do Usuário
Para tornar nosso programa mais interativo, podemos permitir que o usuário insira os inteiros que deseja adicionar ao ArrayList. Aqui está um exemplo:
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("Original ArrayList: " + arrayList1);
// Remove duplicates using HashSet
removeDuplicatesUsingHashSet(arrayList1);
// Remove duplicates using 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 with duplicates removed using HashSet: " + arrayList);
}
public static <T> void removeDuplicatesUsingStream(ArrayList<T> arrayList) {
arrayList = (ArrayList<T>) arrayList.stream().distinct().collect(Collectors.toList());
System.out.println("ArrayList with duplicates removed using Stream: " + arrayList);
}
public static int getUserInput() {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter an integer to add to the ArrayList, or -1 to quit: ");
if (scanner.hasNextInt()) {
return scanner.nextInt();
}
return -1;
}
}
Compilar e Executar a Versão Final
Para executar o código no terminal, navegue até o diretório que contém o arquivo e insira o seguinte comando:
javac RemoveDuplicates.java && java RemoveDuplicates
Resumo
Neste laboratório, aprendemos como remover duplicatas de um ArrayList de duas maneiras: usando um HashSet e usando o método distinct() de Stream. Também criamos uma função para facilitar a remoção de duplicatas de múltiplos ArrayLists em nosso programa, modificamos o tipo de dado para tornar a função mais flexível e permitimos que o usuário insira os inteiros que deseja adicionar ao ArrayList.



