Remover Duplicatas de ArrayList

JavaBeginner
Pratique Agora

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.