Élimination des Doublons avec la Méthode distinct()
Dans le développement réel, il est fréquent de rencontrer des situations où les données contiennent des doublons qu'il est nécessaire de supprimer. Par exemple, imaginez que vous compiliez une liste de participants à une conférence, mais qu'en raison d'erreurs système, certains noms aient été enregistrés deux fois.
La méthode distinct() permet de résoudre ce problème en éliminant les éléments dupliqués d'un flux.
Stream<T> distinct()
Cette méthode retourne un stream ne contenant que des éléments uniques, en filtrant tous les doublons.
Fonctionnement
La méthode distinct() s'appuie sur hashCode() pour détecter rapidement les doublons potentiels et sur equals() pour confirmer s'ils sont réellement identiques. Si deux objets ont des codes de hachage différents, ils sont considérés comme uniques. Si les codes de hachage correspondent, equals() est appelé pour vérifier leur égalité selon des critères spécifiques.
Ensemble, ces méthodes forment le contrat hashCode() et equals()
contrat, garantissant une comparaison correcte et une suppression des doublons.
Au lieu de les écrire manuellement, IntelliJ IDEA permet de les générer automatiquement.
Dans IntelliJ IDEA, le menu de génération de code a été ouvert (Alt + Insert sur Windows/Linux, Cmd + N sur Mac) et les méthodes equals() et hashCode() ont été sélectionnées. Après avoir choisi les champs à inclure dans la comparaison, IDEA a généré automatiquement les méthodes nécessaires.
Exemple pratique
Une usine suit la production de pièces, mais le rapport contient des doublons ainsi que des pièces défectueuses étiquetées DEFECT. L'objectif est de nettoyer la liste, en conservant uniquement les pièces uniques et non défectueuses, de les trier par nom, puis de les afficher au format : Name - Serial Number.
Main.java
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364package com.example; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Part> parts = List.of( new Part("SN001", "Gear"), new Part("SN002", "Bolt"), new Part("SN003", "Nut"), new Part("SN001", "Gear"), new Part("SN004", "DEFECT Shaft"), new Part("SN005", "Screw"), new Part("SN002", "Bolt"), new Part("SN006", "DEFECT Washer") ); List<String> processedParts = parts.stream() .distinct() .filter(part -> !part.getName().contains("DEFECT")) .sorted((p1, p2) -> p1.getName().compareToIgnoreCase(p2.getName())) .map(part -> part.getName() + " - " + part.getSerialNumber()) .toList(); System.out.println(processedParts); } } class Part { private String serialNumber; private String name; public Part(String serialNumber, String name) { this.serialNumber = serialNumber; this.name = name; } public String getSerialNumber() { return serialNumber; } public String getName() { return name; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Part)) return false; Part part = (Part) o; return serialNumber.equals(part.serialNumber); } @Override public int hashCode() { return serialNumber.hashCode(); } @Override public String toString() { return name + " - " + serialNumber; } }
Pour supprimer les doublons et filtrer les pièces défectueuses, il est nécessaire d'implémenter correctement les méthodes equals() et hashCode() afin de comparer les pièces par numéro de série.
Ensuite, il faut utiliser distinct() pour éliminer les doublons, filter() pour retirer les pièces défectueuses contenant DEFECT dans leur nom, sorted() pour trier les pièces restantes, et map() pour les formater en chaînes de caractères.
1. Qu'est-ce qui est utilisé pour comparer les éléments dans la méthode distinct() ?
2. Si deux objets ont le même hashCode(), mais que leur méthode equals() retourne false, seront-ils considérés comme identiques dans la méthode distinct() ?
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion
Can you show me a code example of how to use distinct() in this scenario?
How do I implement equals() and hashCode() for my Part class?
What does the full stream pipeline look like for this example?
Awesome!
Completion rate improved to 2.33
Élimination des Doublons avec la Méthode distinct()
Glissez pour afficher le menu
Dans le développement réel, il est fréquent de rencontrer des situations où les données contiennent des doublons qu'il est nécessaire de supprimer. Par exemple, imaginez que vous compiliez une liste de participants à une conférence, mais qu'en raison d'erreurs système, certains noms aient été enregistrés deux fois.
La méthode distinct() permet de résoudre ce problème en éliminant les éléments dupliqués d'un flux.
Stream<T> distinct()
Cette méthode retourne un stream ne contenant que des éléments uniques, en filtrant tous les doublons.
Fonctionnement
La méthode distinct() s'appuie sur hashCode() pour détecter rapidement les doublons potentiels et sur equals() pour confirmer s'ils sont réellement identiques. Si deux objets ont des codes de hachage différents, ils sont considérés comme uniques. Si les codes de hachage correspondent, equals() est appelé pour vérifier leur égalité selon des critères spécifiques.
Ensemble, ces méthodes forment le contrat hashCode() et equals()
contrat, garantissant une comparaison correcte et une suppression des doublons.
Au lieu de les écrire manuellement, IntelliJ IDEA permet de les générer automatiquement.
Dans IntelliJ IDEA, le menu de génération de code a été ouvert (Alt + Insert sur Windows/Linux, Cmd + N sur Mac) et les méthodes equals() et hashCode() ont été sélectionnées. Après avoir choisi les champs à inclure dans la comparaison, IDEA a généré automatiquement les méthodes nécessaires.
Exemple pratique
Une usine suit la production de pièces, mais le rapport contient des doublons ainsi que des pièces défectueuses étiquetées DEFECT. L'objectif est de nettoyer la liste, en conservant uniquement les pièces uniques et non défectueuses, de les trier par nom, puis de les afficher au format : Name - Serial Number.
Main.java
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364package com.example; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Part> parts = List.of( new Part("SN001", "Gear"), new Part("SN002", "Bolt"), new Part("SN003", "Nut"), new Part("SN001", "Gear"), new Part("SN004", "DEFECT Shaft"), new Part("SN005", "Screw"), new Part("SN002", "Bolt"), new Part("SN006", "DEFECT Washer") ); List<String> processedParts = parts.stream() .distinct() .filter(part -> !part.getName().contains("DEFECT")) .sorted((p1, p2) -> p1.getName().compareToIgnoreCase(p2.getName())) .map(part -> part.getName() + " - " + part.getSerialNumber()) .toList(); System.out.println(processedParts); } } class Part { private String serialNumber; private String name; public Part(String serialNumber, String name) { this.serialNumber = serialNumber; this.name = name; } public String getSerialNumber() { return serialNumber; } public String getName() { return name; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Part)) return false; Part part = (Part) o; return serialNumber.equals(part.serialNumber); } @Override public int hashCode() { return serialNumber.hashCode(); } @Override public String toString() { return name + " - " + serialNumber; } }
Pour supprimer les doublons et filtrer les pièces défectueuses, il est nécessaire d'implémenter correctement les méthodes equals() et hashCode() afin de comparer les pièces par numéro de série.
Ensuite, il faut utiliser distinct() pour éliminer les doublons, filter() pour retirer les pièces défectueuses contenant DEFECT dans leur nom, sorted() pour trier les pièces restantes, et map() pour les formater en chaînes de caractères.
1. Qu'est-ce qui est utilisé pour comparer les éléments dans la méthode distinct() ?
2. Si deux objets ont le même hashCode(), mais que leur méthode equals() retourne false, seront-ils considérés comme identiques dans la méthode distinct() ?
Merci pour vos commentaires !