Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Eliminering af Dubletter med distinct()-Metoden | Mellemliggende Operationer i Stream API
Stream API

bookEliminering af Dubletter med distinct()-Metoden

I virkelige udviklingssituationer støder du ofte på tilfælde, hvor data indeholder dubletter, der skal fjernes. Forestil dig for eksempel, at du samler en liste over konferencedeltagere, men på grund af systemfejl er nogle navne blevet registreret to gange.

Metoden distinct() hjælper med at løse dette problem ved at fjerne dublerede elementer fra en stream.

Stream<T> distinct()

Denne metode returnerer en stream, der kun indeholder unikke elementer, hvor alle dubletter filtreres fra.

Sådan fungerer det

Metoden distinct() benytter hashCode() til hurtigt at opdage potentielle dubletter og equals() til at bekræfte, om de faktisk er identiske. Hvis to objekter har forskellige hash codes, betragtes de som unikke. Hvis hash codes er ens, kaldes equals() for at verificere deres lighed baseret på specifikke kriterier.

Disse metoder udgør tilsammen hashCode() og equals() kontrakten, hvilket sikrer korrekt sammenligning og fjernelse af dubletter.

I stedet for at skrive dem manuelt, giver IntelliJ IDEA mulighed for at generere dem automatisk.

I IntelliJ IDEA åbnede du menuen for kodegenerering (Alt + InsertWindows/Linux, Cmd + NMac) og valgte equals() og hashCode(). Efter valg af felter til sammenligning genererede IDEA automatisk de nødvendige metoder.

Praktisk eksempel

En fabrik registrerer producerede dele, men rapporten indeholder dubletter samt defekte dele markeret med DEFECT. Målet er at rense listen, så kun unikke, ikke-defekte dele bevares, sortere dem efter 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 at fjerne dubletter og filtrere defekte dele fra, skal metoderne equals() og hashCode() implementeres korrekt, så dele sammenlignes ud fra serienummer.

Herefter bruges distinct() til at fjerne dubletter, filter() til at fjerne defekte dele der indeholder DEFECT i navnet, sorted() til at sortere de resterende dele, og map() til at formatere dem som strenge.

1. Hvad bruges til at sammenligne elementer i distinct()-metoden?

2. Hvis to objekter har samme hashCode(), men deres equals()-metode returnerer false, vil de så blive betragtet som ens i distinct()-metoden?

question mark

Hvad bruges til at 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 så blive betragtet som ens i distinct()-metoden?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 2. Kapitel 7

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Awesome!

Completion rate improved to 2.33

bookEliminering af Dubletter med distinct()-Metoden

Stryg for at vise menuen

I virkelige udviklingssituationer støder du ofte på tilfælde, hvor data indeholder dubletter, der skal fjernes. Forestil dig for eksempel, at du samler en liste over konferencedeltagere, men på grund af systemfejl er nogle navne blevet registreret to gange.

Metoden distinct() hjælper med at løse dette problem ved at fjerne dublerede elementer fra en stream.

Stream<T> distinct()

Denne metode returnerer en stream, der kun indeholder unikke elementer, hvor alle dubletter filtreres fra.

Sådan fungerer det

Metoden distinct() benytter hashCode() til hurtigt at opdage potentielle dubletter og equals() til at bekræfte, om de faktisk er identiske. Hvis to objekter har forskellige hash codes, betragtes de som unikke. Hvis hash codes er ens, kaldes equals() for at verificere deres lighed baseret på specifikke kriterier.

Disse metoder udgør tilsammen hashCode() og equals() kontrakten, hvilket sikrer korrekt sammenligning og fjernelse af dubletter.

I stedet for at skrive dem manuelt, giver IntelliJ IDEA mulighed for at generere dem automatisk.

I IntelliJ IDEA åbnede du menuen for kodegenerering (Alt + InsertWindows/Linux, Cmd + NMac) og valgte equals() og hashCode(). Efter valg af felter til sammenligning genererede IDEA automatisk de nødvendige metoder.

Praktisk eksempel

En fabrik registrerer producerede dele, men rapporten indeholder dubletter samt defekte dele markeret med DEFECT. Målet er at rense listen, så kun unikke, ikke-defekte dele bevares, sortere dem efter 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 at fjerne dubletter og filtrere defekte dele fra, skal metoderne equals() og hashCode() implementeres korrekt, så dele sammenlignes ud fra serienummer.

Herefter bruges distinct() til at fjerne dubletter, filter() til at fjerne defekte dele der indeholder DEFECT i navnet, sorted() til at sortere de resterende dele, og map() til at formatere dem som strenge.

1. Hvad bruges til at sammenligne elementer i distinct()-metoden?

2. Hvis to objekter har samme hashCode(), men deres equals()-metode returnerer false, vil de så blive betragtet som ens i distinct()-metoden?

question mark

Hvad bruges til at 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 så blive betragtet som ens i distinct()-metoden?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 2. Kapitel 7
some-alt