Duplikaattien 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
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; } }
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?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme