Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Fjerning av Duplikater med Distinct()-Metoden | Intermediære Operasjoner i Stream API
Stream-API

bookFjerning 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 + InsertWindows/Linux, Cmd + NMac) 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

Main.java

copy
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
package 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?

question mark

Hva brukes for å sammenligne elementer i distinct()-metoden?

Select the correct answer

question mark

Hvis to objekter har samme hashCode(), men deres equals()-metode returnerer false, vil de bli betraktet som like i distinct()-metoden?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 7

Spør AI

expand

Spør AI

ChatGPT

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

bookFjerning 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 + InsertWindows/Linux, Cmd + NMac) 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

Main.java

copy
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
package 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?

question mark

Hva brukes for å sammenligne elementer i distinct()-metoden?

Select the correct answer

question mark

Hvis to objekter har samme hashCode(), men deres equals()-metode returnerer false, vil de bli betraktet som like i distinct()-metoden?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 7
some-alt