Comment vérifier si une collection contient des doublons en Java

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

Dans ce laboratoire, vous apprendrez à vérifier efficacement la présence d'éléments en double dans une collection Java. Nous allons explorer l'utilisation de HashSet, un outil puissant du Framework de collections Java, pour identifier les doublons.

À travers des étapes pratiques, vous apprendrez d'abord à tirer parti de la propriété des éléments uniques de HashSet pour détecter les doublons. Ensuite, vous découvrirez une méthode alternative en comparant les tailles de la collection originale et d'un HashSet créé à partir d'elle. Enfin, nous examinerons comment gérer les éléments nuls lors de la vérification des doublons.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL 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/arraylist("ArrayList") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/hashset("HashSet") subgraph Lab Skills java/arrays -.-> lab-559941{{"Comment vérifier si une collection contient des doublons en Java"}} java/collections_methods -.-> lab-559941{{"Comment vérifier si une collection contient des doublons en Java"}} java/arraylist -.-> lab-559941{{"Comment vérifier si une collection contient des doublons en Java"}} java/hashset -.-> lab-559941{{"Comment vérifier si une collection contient des doublons en Java"}} end

Utiliser HashSet pour vérifier les doublons

Dans cette étape, nous allons explorer comment utiliser un HashSet en Java pour vérifier efficacement la présence d'éléments en double dans une collection. HashSet fait partie du Framework de collections Java et est particulièrement utile car il stocke des éléments uniques et offre des recherches très rapides.

Tout d'abord, créons un nouveau fichier Java nommé DuplicateCheck.java dans votre répertoire ~/project. Vous pouvez le faire directement dans l'Explorateur de fichiers de l'IDE Web en cliquant avec le bouton droit dans la zone de la liste des fichiers et en sélectionnant "Nouveau fichier", puis en tapant DuplicateCheck.java.

Maintenant, ouvrez le fichier DuplicateCheck.java dans l'Éditeur de code et ajoutez le code suivant :

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class DuplicateCheck {

    public static void main(String[] args) {
        // Create a list with some duplicate elements
        List<String> names = new ArrayList<>();
        names.add("Alice");
        names.add("Bob");
        names.add("Alice"); // Duplicate
        names.add("Charlie");
        names.add("Bob"); // Duplicate

        System.out.println("Original List: " + names);

        // Use a HashSet to find duplicates
        Set<String> uniqueNames = new HashSet<>();
        Set<String> duplicates = new HashSet<>();

        for (String name : names) {
            if (!uniqueNames.add(name)) {
                // If add returns false, the element is already in the set
                duplicates.add(name);
            }
        }

        System.out.println("Duplicates found: " + duplicates);
    }
}

Décortiquons les nouvelles parties de ce code :

  • import java.util.ArrayList;, import java.util.HashSet;, import java.util.List;, import java.util.Set; : Ces lignes importent les classes nécessaires de la bibliothèque utilitaire Java pour travailler avec des listes et des ensembles.
  • List<String> names = new ArrayList<>(); : Cela crée une List appelée names qui peut contenir des objets String. Nous utilisons ArrayList comme une implémentation spécifique de l'interface List.
  • names.add(...) : Cela ajoute des éléments à notre liste names. Remarquez que "Alice" et "Bob" sont ajoutés deux fois.
  • Set<String> uniqueNames = new HashSet<>(); : Cela crée un Set appelé uniqueNames en utilisant l'implémentation HashSet. Un Set garantit qu'il ne contiendra que des éléments uniques.
  • Set<String> duplicates = new HashSet<>(); : Cela crée un autre Set pour stocker les éléments en double que nous trouvons.
  • for (String name : names) : Il s'agit d'une boucle for-each qui parcourt chaque name dans la liste names.
  • if (!uniqueNames.add(name)) : La méthode add() d'un HashSet renvoie true si l'élément a été ajouté avec succès (ce qui signifie qu'il n'était pas déjà dans l'ensemble), et false si l'élément était déjà présent. Le ! inverse le résultat, donc le code à l'intérieur du bloc if s'exécute seulement lorsque add() renvoie false, indiquant un doublon.
  • duplicates.add(name); : Si un doublon est trouvé, nous l'ajoutons à notre ensemble duplicates.

Enregistrez le fichier DuplicateCheck.java (Ctrl+S ou Cmd+S).

Maintenant, ouvrez le Terminal en bas de l'IDE Web. Assurez-vous que vous êtes dans le répertoire ~/project. Vous pouvez le confirmer en tapant pwd et en appuyant sur Entrée. La sortie devrait être /home/labex/project.

Compilez le programme Java en utilisant la commande javac :

javac DuplicateCheck.java

S'il n'y a pas d'erreurs, vous ne devriez voir aucune sortie. Cela signifie que la compilation a réussi et qu'un fichier DuplicateCheck.class a été créé dans le répertoire ~/project. Vous pouvez le vérifier en exécutant la commande ls.

Enfin, exécutez le programme Java compilé en utilisant la commande java :

java DuplicateCheck

Vous devriez voir une sortie similaire à ceci :

Original List: [Alice, Bob, Alice, Charlie, Bob]
Duplicates found: [Alice, Bob]

L'ordre des éléments dans la sortie Duplicates found peut varier car HashSet ne conserve pas l'ordre d'insertion.

Vous avez utilisé avec succès un HashSet pour identifier les éléments en double dans une liste !

Comparer les tailles de la collection et de l'ensemble

Dans l'étape précédente, nous avons utilisé un HashSet pour trouver les éléments en double. Une caractéristique clé d'un Set est qu'il ne stocke que des éléments uniques. Cela signifie que si vous ajoutez des éléments en double à un Set, seule une instance de chaque élément sera conservée. Cette propriété est très utile pour des tâches telles que la suppression des doublons d'une liste.

Dans cette étape, nous allons modifier notre programme DuplicateCheck.java pour démontrer cette propriété en comparant la taille de la liste originale (qui peut contenir des doublons) avec la taille d'un HashSet créé à partir de cette liste (qui ne contiendra que des éléments uniques).

Ouvrez le fichier DuplicateCheck.java dans l'Éditeur de code de l'IDE Web.

Modifiez la méthode main pour qu'elle ressemble à ceci :

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class DuplicateCheck {

    public static void main(String[] args) {
        // Create a list with some duplicate elements
        List<String> names = new ArrayList<>();
        names.add("Alice");
        names.add("Bob");
        names.add("Alice"); // Duplicate
        names.add("Charlie");
        names.add("Bob"); // Duplicate
        names.add("David");

        System.out.println("Original List: " + names);
        System.out.println("Size of Original List: " + names.size());

        // Create a HashSet from the list
        Set<String> uniqueNamesSet = new HashSet<>(names);

        System.out.println("Set created from List: " + uniqueNamesSet);
        System.out.println("Size of Set: " + uniqueNamesSet.size());

        // The difference in size tells us how many duplicates were removed
        int duplicatesCount = names.size() - uniqueNamesSet.size();
        System.out.println("Number of duplicates (excluding first occurrence): " + duplicatesCount);
    }
}

Voici ce que nous avons ajouté ou modifié :

  • Nous avons ajouté un autre nom, "David", à la liste names pour avoir une liste un peu plus grande.
  • System.out.println("Size of Original List: " + names.size()); : Nous affichons la taille de la liste originale en utilisant la méthode size().
  • Set<String> uniqueNamesSet = new HashSet<>(names); : C'est un moyen pratique de créer un HashSet directement à partir d'une autre Collection (comme notre ArrayList). Lorsque vous faites cela, le HashSet ajoute automatiquement tous les éléments de la liste, et comme c'est un Set, il éliminera tout doublon.
  • System.out.println("Size of Set: " + uniqueNamesSet.size()); : Nous affichons la taille du HashSet. Cette taille représente le nombre d'éléments uniques.
  • int duplicatesCount = names.size() - uniqueNamesSet.size(); : Nous calculons la différence entre la taille de la liste et la taille de l'ensemble. Cette différence nous indique combien d'éléments étaient des doublons (au-delà de leur première apparition).

Enregistrez le fichier DuplicateCheck.java modifié.

Maintenant, compilez le programme à nouveau dans le Terminal :

javac DuplicateCheck.java

Si la compilation réussit, exécutez le programme :

java DuplicateCheck

Vous devriez voir une sortie similaire à ceci :

Original List: [Alice, Bob, Alice, Charlie, Bob, David]
Size of Original List: 6
Set created from List: [Alice, Bob, Charlie, David]
Size of Set: 4
Number of duplicates (excluding first occurrence): 2

Remarquez que la taille de la liste originale est de 6, mais la taille du HashSet créé à partir d'elle est de 4. La différence (6 - 4 = 2) indique correctement qu'il y avait deux noms en double ("Alice" et "Bob" ont chacun apparu une fois après leur première occurrence).

Cela démontre à quel point il est facile d'utiliser un HashSet pour trouver le nombre d'éléments uniques ou le nombre de doublons dans une collection.

Tester avec des éléments null

Dans les étapes précédentes, nous avons vu comment HashSet gère les éléments non nuls en double. Maintenant, explorons le comportement de HashSet lorsque nous essayons d'ajouter des éléments null. Comprendre comment les collections gèrent les valeurs null est important car cela peut parfois entraîner des comportements inattendus ou des erreurs si cela n'est pas géré avec soin.

Un HashSet autorise un seul élément null. Si vous essayez d'ajouter null plusieurs fois, seul le premier null sera stocké.

Modifions encore une fois notre programme DuplicateCheck.java pour tester cela.

Ouvrez le fichier DuplicateCheck.java dans l'Éditeur de code de l'IDE Web.

Modifiez la méthode main pour inclure des valeurs null dans la liste :

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class DuplicateCheck {

    public static void main(String[] args) {
        // Create a list with some duplicate and null elements
        List<String> names = new ArrayList<>();
        names.add("Alice");
        names.add("Bob");
        names.add(null); // Add null
        names.add("Alice"); // Duplicate
        names.add("Charlie");
        names.add(null); // Add null again
        names.add("Bob"); // Duplicate
        names.add("David");
        names.add(null); // Add null a third time

        System.out.println("Original List: " + names);
        System.out.println("Size of Original List: " + names.size());

        // Create a HashSet from the list
        Set<String> uniqueNamesSet = new HashSet<>(names);

        System.out.println("Set created from List: " + uniqueNamesSet);
        System.out.println("Size of Set: " + uniqueNamesSet.size());

        // The difference in size tells us how many duplicates were removed
        // Note: This calculation is less straightforward with nulls and duplicates combined
        // int duplicatesCount = names.size() - uniqueNamesSet.size();
        // System.out.println("Number of duplicates (excluding first occurrence): " + duplicatesCount);
    }
}

Ici, nous avons ajouté null à la liste names plusieurs fois. Nous avons également mis en commentaire le calcul du nombre de doublons car il devient moins significatif lorsque null est impliqué et que nous nous concentrons sur le comportement de l'ensemble avec null.

Enregistrez le fichier DuplicateCheck.java modifié.

Compilez le programme dans le Terminal :

javac DuplicateCheck.java

Si la compilation réussit, exécutez le programme :

java DuplicateCheck

Vous devriez voir une sortie similaire à ceci :

Original List: [Alice, Bob, null, Alice, Charlie, null, Bob, David, null]
Size of Original List: 9
Set created from List: [null, Alice, Bob, Charlie, David]
Size of Set: 5

Observez la sortie :

  • La Original List affiche tous les éléments, y compris les multiples valeurs null. Sa taille est de 9.
  • Le Set created from List ne contient que des éléments uniques. Remarquez que null n'apparaît qu'une seule fois dans l'ensemble, même si il a été ajouté plusieurs fois à la liste. La taille de l'ensemble est de 5 (Alice, Bob, Charlie, David et null).

Cela confirme que HashSet autorise un seul élément null et traite les ajouts de null suivants comme des doublons, tout comme tout autre élément.

Vous avez maintenant testé avec succès le comportement de HashSet avec des éléments null. Cela conclut notre exploration de l'utilisation de HashSet pour la vérification des doublons et la compréhension de son comportement avec des éléments uniques et des éléments null.

Résumé

Dans ce laboratoire (lab), nous avons appris à vérifier efficacement la présence d'éléments en double dans une collection Java en utilisant un HashSet. Nous avons créé une List contenant des éléments en double, puis nous l'avons parcourue en tentant d'ajouter chaque élément à un HashSet. En vérifiant la valeur de retour de la méthode add(), qui renvoie false si l'élément est déjà présent, nous avons pu identifier et collecter les éléments en double dans un autre HashSet. Cette méthode exploite la propriété des éléments uniques et les capacités de recherche rapides du HashSet pour une détection efficace des doublons.