Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Duplikaattien Poistaminen Distinct()-Metodilla | Osio
Practice
Projects
Quizzes & Challenges
Visat
Challenges
/
Stream API Javassa

bookDuplikaattien Poistaminen Distinct()-Metodilla

Pyyhkäise näyttääksesi valikon

Todellisessa ohjelmistokehityksessä kohtaat usein tilanteita, joissa data sisältää duplikaatteja, jotka täytyy poistaa. Esimerkiksi, kun laadit listaa konferenssin osallistujista, mutta järjestelmävirheiden vuoksi jotkut nimet on tallennettu kahteen kertaan.

distinct()-metodi auttaa ratkaisemaan tämän ongelman poistamalla päällekkäiset alkiot streamista.

Stream<T> distinct()

Tämä metodi palauttaa streamin, joka sisältää vain yksilölliset alkiot, poistaen kaikki duplikaatit.

Toimintaperiaate

distinct()-metodi hyödyntää hashCode()-metodia tunnistaakseen nopeasti mahdolliset duplikaatit ja equals()-metodia varmistaakseen, ovatko ne todella identtisiä. Jos kahdella oliolla on eri hash-koodit, ne katsotaan yksilöllisiksi. Jos hash-koodit täsmäävät, kutsutaan equals()-metodia tarkistamaan niiden yhtäläisyys tiettyjen kriteerien perusteella.

Nämä metodit muodostavat yhdessä hashCode()- ja equals()- sopimuksen, joka varmistaa asianmukaisen vertailun ja duplikaattien poistamisen.

Sen sijaan, että nämä kirjoitettaisiin käsin, IntelliJ IDEA mahdollistaa niiden automaattisen generoinnin.

IntelliJ IDEA:ssa avasit koodin generointi -valikon (Alt + Insert Windows/Linux-järjestelmissä, Cmd + N Macilla) ja valitsit equals() ja hashCode(). Valittujen kenttien perusteella IDEA generoi automaattisesti tarvittavat metodit.

Käytännön esimerkki

Tehdas seuraa valmistettuja osia, mutta raportissa esiintyy duplikaatteja sekä viallisia osia, jotka on merkitty DEFECT. Tavoitteena on puhdistaa lista siten, että jäljelle jäävät vain yksilölliset, ei-vialliset osat, lajitellaan ne nimen mukaan ja esitetään muodossa: 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; } }

Duplikaattien poistamiseksi ja viallisten osien suodattamiseksi equals()- ja hashCode()-metodit tulee toteuttaa oikein vertailemaan osia sarjanumeron perusteella.

Tämän jälkeen käytetään distinct()-metodia duplikaattien poistamiseen, filter()-metodia viallisten osien poistamiseen, joiden nimessä on DEFECT, sorted()-metodia jäljelle jäävien osien järjestämiseen sekä map()-metodia niiden muotoiluun merkkijonoiksi.

1. Mitä käytetään alkioiden vertailuun distinct()-metodissa?

2. Jos kahdella oliolla on sama hashCode(), mutta niiden equals()-metodi palauttaa false, pidetäänkö niitä samoina distinct()-metodissa?

question mark

Mitä käytetään alkioiden vertailuun distinct()-metodissa?

Select the correct answer

question mark

Jos kahdella oliolla on sama hashCode(), mutta niiden equals()-metodi palauttaa false, pidetäänkö niitä samoina distinct()-metodissa?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 22

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Osio 1. Luku 22
some-alt