Duplikate mit der distinct()-Methode Entfernen
In der realen Softwareentwicklung treten häufig Situationen auf, in denen Daten Duplikate enthalten, die entfernt werden müssen. Stellen Sie sich beispielsweise vor, Sie erstellen eine Liste von Konferenzteilnehmern, aber aufgrund von Systemfehlern wurden einige Namen doppelt erfasst.
Die Methode distinct() löst dieses Problem, indem sie doppelte Elemente aus einem Stream entfernt.
Stream<T> distinct()
Diese Methode gibt einen Stream zurück, der nur einzigartige Elemente enthält und alle Duplikate herausfiltert.
Funktionsweise
Die Methode distinct() verwendet hashCode(), um potenzielle Duplikate schnell zu erkennen, und equals(), um zu bestätigen, ob sie tatsächlich identisch sind. Haben zwei Objekte unterschiedliche Hashcodes, gelten sie als einzigartig. Stimmen die Hashcodes überein, wird equals() aufgerufen, um deren Gleichheit anhand spezifischer Kriterien zu überprüfen.
Zusammen bilden diese Methoden den hashCode()- und equals()
Vertrag, der eine korrekte Vergleichbarkeit und Duplikaterkennung gewährleistet.
Anstatt sie manuell zu schreiben, ermöglicht IntelliJ IDEA das automatische Generieren dieser Methoden.
In IntelliJ IDEA wurde das Menü zur Codegenerierung geöffnet (Alt + Insert unter Windows/Linux, Cmd + N unter Mac) und equals() sowie hashCode() ausgewählt. Nach Auswahl der Felder für den Vergleich hat IDEA die erforderlichen Methoden automatisch generiert.
Praktisches Beispiel
Eine Fabrik verfolgt produzierte Teile, aber der Bericht enthält Duplikate sowie defekte Teile, die mit DEFECT gekennzeichnet sind. Ziel ist es, die Liste zu bereinigen, sodass nur eindeutige, nicht defekte Teile erhalten bleiben, diese nach Name sortiert und im Format Name - Serial Number angezeigt werden.
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; } }
Um Duplikate zu entfernen und defekte Teile herauszufiltern, müssen die Methoden equals() und hashCode() korrekt implementiert werden, sodass Teile anhand der Seriennummer verglichen werden.
Anschließend wird distinct() verwendet, um Duplikate zu eliminieren, filter(), um defekte Teile mit DEFECT im Namen zu entfernen, sorted(), um die verbleibenden Teile zu sortieren, und map(), um sie als Strings zu formatieren.
1. Was wird verwendet, um Elemente in der Methode distinct() zu vergleichen?
2. Wenn zwei Objekte denselben hashCode() haben, aber ihre Methode equals() false zurückgibt, werden sie in der Methode distinct() als gleich betrachtet?
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
Awesome!
Completion rate improved to 2.33
Duplikate mit der distinct()-Methode Entfernen
Swipe um das Menü anzuzeigen
In der realen Softwareentwicklung treten häufig Situationen auf, in denen Daten Duplikate enthalten, die entfernt werden müssen. Stellen Sie sich beispielsweise vor, Sie erstellen eine Liste von Konferenzteilnehmern, aber aufgrund von Systemfehlern wurden einige Namen doppelt erfasst.
Die Methode distinct() löst dieses Problem, indem sie doppelte Elemente aus einem Stream entfernt.
Stream<T> distinct()
Diese Methode gibt einen Stream zurück, der nur einzigartige Elemente enthält und alle Duplikate herausfiltert.
Funktionsweise
Die Methode distinct() verwendet hashCode(), um potenzielle Duplikate schnell zu erkennen, und equals(), um zu bestätigen, ob sie tatsächlich identisch sind. Haben zwei Objekte unterschiedliche Hashcodes, gelten sie als einzigartig. Stimmen die Hashcodes überein, wird equals() aufgerufen, um deren Gleichheit anhand spezifischer Kriterien zu überprüfen.
Zusammen bilden diese Methoden den hashCode()- und equals()
Vertrag, der eine korrekte Vergleichbarkeit und Duplikaterkennung gewährleistet.
Anstatt sie manuell zu schreiben, ermöglicht IntelliJ IDEA das automatische Generieren dieser Methoden.
In IntelliJ IDEA wurde das Menü zur Codegenerierung geöffnet (Alt + Insert unter Windows/Linux, Cmd + N unter Mac) und equals() sowie hashCode() ausgewählt. Nach Auswahl der Felder für den Vergleich hat IDEA die erforderlichen Methoden automatisch generiert.
Praktisches Beispiel
Eine Fabrik verfolgt produzierte Teile, aber der Bericht enthält Duplikate sowie defekte Teile, die mit DEFECT gekennzeichnet sind. Ziel ist es, die Liste zu bereinigen, sodass nur eindeutige, nicht defekte Teile erhalten bleiben, diese nach Name sortiert und im Format Name - Serial Number angezeigt werden.
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; } }
Um Duplikate zu entfernen und defekte Teile herauszufiltern, müssen die Methoden equals() und hashCode() korrekt implementiert werden, sodass Teile anhand der Seriennummer verglichen werden.
Anschließend wird distinct() verwendet, um Duplikate zu eliminieren, filter(), um defekte Teile mit DEFECT im Namen zu entfernen, sorted(), um die verbleibenden Teile zu sortieren, und map(), um sie als Strings zu formatieren.
1. Was wird verwendet, um Elemente in der Methode distinct() zu vergleichen?
2. Wenn zwei Objekte denselben hashCode() haben, aber ihre Methode equals() false zurückgibt, werden sie in der Methode distinct() als gleich betrachtet?
Danke für Ihr Feedback!