Supprimer les doublons d'un ArrayList

JavaJavaBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

En Java, un ArrayList peut stocker des éléments dupliqués. Si nous voulons supprimer les doublons et ne conserver que les éléments uniques, nous devons prendre des mesures spécifiques. Dans ce laboratoire, nous allons apprendre deux façons de supprimer les doublons d'un ArrayList: en utilisant un HashSet et en utilisant la méthode distinct() de Stream.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/FileandIOManagementGroup(["File and I/O Management"]) java(("Java")) -.-> java/ConcurrentandNetworkProgrammingGroup(["Concurrent and Network Programming"]) java(("Java")) -.-> java/DataStructuresGroup(["Data Structures"]) 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{{"Supprimer les doublons d'un ArrayList"}} java/collections_methods -.-> lab-117445{{"Supprimer les doublons d'un ArrayList"}} java/classes_objects -.-> lab-117445{{"Supprimer les doublons d'un ArrayList"}} java/user_input -.-> lab-117445{{"Supprimer les doublons d'un ArrayList"}} java/arraylist -.-> lab-117445{{"Supprimer les doublons d'un ArrayList"}} java/hashset -.-> lab-117445{{"Supprimer les doublons d'un ArrayList"}} java/generics -.-> lab-117445{{"Supprimer les doublons d'un ArrayList"}} java/stream -.-> lab-117445{{"Supprimer les doublons d'un ArrayList"}} java/working -.-> lab-117445{{"Supprimer les doublons d'un ArrayList"}} end

Créer un ArrayList

Créez un ArrayList et ajoutez-y quelques éléments. Voici un exemple :

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);
    }
}

Pour exécuter le code dans le terminal, accédez au répertoire contenant le fichier et entrez la commande suivante :

javac RemoveDuplicates.java && java RemoveDuplicates

Supprimer les doublons à l'aide d'un HashSet

Pour supprimer les doublons à l'aide d'un HashSet, créez d'abord un HashSet et passez l'ArrayList à son constructeur. Étant donné que le HashSet ne contient que des éléments uniques, cela élimine tous les doublons. Convertissez le HashSet résultant en retournant 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);

        // Supprimer les doublons
        HashSet<Integer> hashSet = new HashSet<>(arrayList);
        arrayList.clear();
        arrayList.addAll(hashSet);

        System.out.println("ArrayList avec les doublons supprimés à l'aide d'un HashSet : " + arrayList);
    }
}

Supprimer les doublons à l'aide de la méthode distinct() de Stream

Pour supprimer les doublons à l'aide de l'API Stream, utilisez d'abord la méthode stream() de ArrayList pour créer un Stream. Ensuite, utilisez la méthode distinct() pour retourner un nouveau flux avec des éléments distincts. Enfin, utilisez la méthode collect() pour retourner les éléments du flux sous forme d'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);

        // Supprimer les doublons
        arrayList = (ArrayList<Integer>) arrayList.stream().distinct().collect(Collectors.toList());

        System.out.println("ArrayList avec les doublons supprimés à l'aide de Stream : " + arrayList);
    }
}

Tester les deux approches

Pour tester les deux approches, compilez et exécutez les deux exemples de code dans le terminal.

javac RemoveDuplicates.java && java RemoveDuplicates

Créer une fonction

Pour faciliter la suppression des doublons dans plusieurs ArrayLists de notre programme, nous pouvons créer une fonction. Voici un exemple :

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);

        // Supprimer les doublons à l'aide d'un HashSet
        removeDuplicatesUsingHashSet(arrayList1);
        removeDuplicatesUsingHashSet(arrayList2);

        // Supprimer les doublons à l'aide de 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 avec les doublons supprimés à l'aide d'un HashSet : " + arrayList);
    }

    public static void removeDuplicatesUsingStream(ArrayList<Integer> arrayList) {
        arrayList = (ArrayList<Integer>) arrayList.stream().distinct().collect(Collectors.toList());
        System.out.println("ArrayList avec les doublons supprimés à l'aide de Stream : " + arrayList);
    }
}

Compiler et exécuter

Pour exécuter le code dans le terminal, accédez au répertoire contenant le fichier et entrez la commande suivante :

javac RemoveDuplicates.java && java RemoveDuplicates

Modifier le type de données

La fonction removeDuplicatesUsingHashSet() ne fonctionne que pour ArrayList<Integer>. Pour rendre la fonction plus flexible, nous pouvons modifier le type de données en 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);

        // Supprimer les doublons à l'aide d'un HashSet
        removeDuplicatesUsingHashSet(arrayList1);
        removeDuplicatesUsingHashSet(arrayList2);

        // Supprimer les doublons à l'aide de 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 avec les doublons supprimés à l'aide d'un HashSet : " + arrayList);
    }

    public static <T> void removeDuplicatesUsingStream(ArrayList<T> arrayList) {
        arrayList = (ArrayList<T>) arrayList.stream().distinct().collect(Collectors.toList());
        System.out.println("ArrayList avec les doublons supprimés à l'aide de Stream : " + arrayList);
    }
}

Compiler et exécuter la version modifiée

Pour exécuter le code dans le terminal, accédez au répertoire contenant le fichier et entrez la commande suivante :

javac RemoveDuplicates.java && java RemoveDuplicates

Ajouter une entrée utilisateur

Pour rendre notre programme plus interactif, nous pouvons permettre à l'utilisateur d'entrer les entiers qu'il souhaite ajouter à l'ArrayList. Voici un exemple :

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);

        // Supprimer les doublons à l'aide d'un HashSet
        removeDuplicatesUsingHashSet(arrayList1);

        // Supprimer les doublons à l'aide de 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 avec les doublons supprimés à l'aide d'un HashSet : " + arrayList);
    }

    public static <T> void removeDuplicatesUsingStream(ArrayList<T> arrayList) {
        arrayList = (ArrayList<T>) arrayList.stream().distinct().collect(Collectors.toList());
        System.out.println("ArrayList avec les doublons supprimés à l'aide de Stream : " + arrayList);
    }

    public static int getUserInput() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Entrez un entier à ajouter à l'ArrayList, ou -1 pour quitter : ");
        if (scanner.hasNextInt()) {
            return scanner.nextInt();
        }
        return -1;
    }
}

Compiler et exécuter la version finale

Pour exécuter le code dans le terminal, accédez au répertoire contenant le fichier et entrez la commande suivante :

javac RemoveDuplicates.java && java RemoveDuplicates

Résumé

Dans ce laboratoire, nous avons appris à supprimer les doublons d'un ArrayList de deux manières : en utilisant un HashSet et en utilisant la méthode distinct() de Stream. Nous avons également créé une fonction pour faciliter la suppression des doublons de plusieurs ArrayList dans notre programme, modifié le type de données pour rendre la fonction plus flexible et permis à l'utilisateur d'entrer les entiers qu'il souhaite ajouter à l'ArrayList.