Fjerning av Duplikater med Distinct()-Metoden
I virkelig utvikling støter du ofte på situasjoner der data inneholder duplikater som må fjernes. For eksempel, tenk deg at du setter sammen en liste over konferansedeltakere, men på grunn av systemfeil har noen navn blitt registrert to ganger.
Metoden distinct() bidrar til å løse dette problemet ved å fjerne dupliserte elementer fra en stream.
Stream<T> distinct()
Denne metoden returnerer en stream som kun inneholder unike elementer, og filtrerer ut alle duplikater.
Hvordan det fungerer
Metoden distinct() benytter hashCode() for raskt å oppdage potensielle duplikater og equals() for å bekrefte om de faktisk er identiske. Hvis to objekter har forskjellige hash-koder, anses de som unike. Hvis hash-kodene er like, kalles equals() for å verifisere likhet basert på spesifikke kriterier.
Sammen utgjør disse metodene hashCode() og equals()
kontrakten, som sikrer korrekt sammenligning og fjerning av duplikater.
I stedet for å skrive dem manuelt, lar IntelliJ IDEA oss generere dem automatisk.
I IntelliJ IDEA åpnet du menyen for kodegenerering (Alt + Insert på Windows/Linux, Cmd + N på Mac) og valgte equals() og hashCode(). Etter å ha valgt feltene som skal inkluderes i sammenligningen, genererte IDEA automatisk de nødvendige metodene.
Praktisk eksempel
En fabrikk fører oversikt over produserte deler, men rapporten inneholder duplikater samt defekte deler merket DEFECT. Målet er å rense listen, beholde kun unike, ikke-defekte deler, sortere dem etter navn, og vise dem i formatet: 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; } }
For å fjerne duplikater og filtrere ut defekte deler, må metodene equals() og hashCode() implementeres korrekt for å sammenligne deler etter serial number.
Deretter brukes distinct() for å eliminere duplikater, filter() for å fjerne defekte deler som inneholder DEFECT i navnet, sorted() for å sortere de gjenværende delene, og map() for å formatere dem som strenger.
1. Hva brukes for å sammenligne elementer i distinct()-metoden?
2. Hvis to objekter har samme hashCode(), men deres equals()-metode returnerer false, vil de bli betraktet som like i distinct()-metoden?
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
Awesome!
Completion rate improved to 2.33
Fjerning av Duplikater med Distinct()-Metoden
Sveip for å vise menyen
I virkelig utvikling støter du ofte på situasjoner der data inneholder duplikater som må fjernes. For eksempel, tenk deg at du setter sammen en liste over konferansedeltakere, men på grunn av systemfeil har noen navn blitt registrert to ganger.
Metoden distinct() bidrar til å løse dette problemet ved å fjerne dupliserte elementer fra en stream.
Stream<T> distinct()
Denne metoden returnerer en stream som kun inneholder unike elementer, og filtrerer ut alle duplikater.
Hvordan det fungerer
Metoden distinct() benytter hashCode() for raskt å oppdage potensielle duplikater og equals() for å bekrefte om de faktisk er identiske. Hvis to objekter har forskjellige hash-koder, anses de som unike. Hvis hash-kodene er like, kalles equals() for å verifisere likhet basert på spesifikke kriterier.
Sammen utgjør disse metodene hashCode() og equals()
kontrakten, som sikrer korrekt sammenligning og fjerning av duplikater.
I stedet for å skrive dem manuelt, lar IntelliJ IDEA oss generere dem automatisk.
I IntelliJ IDEA åpnet du menyen for kodegenerering (Alt + Insert på Windows/Linux, Cmd + N på Mac) og valgte equals() og hashCode(). Etter å ha valgt feltene som skal inkluderes i sammenligningen, genererte IDEA automatisk de nødvendige metodene.
Praktisk eksempel
En fabrikk fører oversikt over produserte deler, men rapporten inneholder duplikater samt defekte deler merket DEFECT. Målet er å rense listen, beholde kun unike, ikke-defekte deler, sortere dem etter navn, og vise dem i formatet: 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; } }
For å fjerne duplikater og filtrere ut defekte deler, må metodene equals() og hashCode() implementeres korrekt for å sammenligne deler etter serial number.
Deretter brukes distinct() for å eliminere duplikater, filter() for å fjerne defekte deler som inneholder DEFECT i navnet, sorted() for å sortere de gjenværende delene, og map() for å formatere dem som strenger.
1. Hva brukes for å sammenligne elementer i distinct()-metoden?
2. Hvis to objekter har samme hashCode(), men deres equals()-metode returnerer false, vil de bli betraktet som like i distinct()-metoden?
Takk for tilbakemeldingene dine!