Duplikaattien Poistaminen Distinct()-Menetelmällä
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 duplikaattielementit streamista.
Stream<T> distinct()
Tämä metodi palauttaa virran, joka sisältää vain yksilölliset alkiot, poistaen kaikki duplikaatit.
Miten se toimii
Metodi distinct() käyttää hashCode()-metodia havaitakseen 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 tasa-arvoisuus 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 avattiin koodin generointi -valikko (Alt + Insert Windows/Linux-järjestelmissä, Cmd + N Mac-järjestelmissä) ja valittiin equals() ja hashCode(). Kentät valittiin vertailua varten, minkä jälkeen 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 poistoon, 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 vertailemaan alkioita distinct()-menetelmässä?
2. Jos kahdella oliolla on sama hashCode(), mutta niiden equals()-menetelmä palauttaa false, pidetäänkö niitä samoina distinct()-menetelmässä?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Can you show me a code example of how to use distinct() in this scenario?
How do I implement equals() and hashCode() for my Part class?
What does the full stream pipeline look like for this example?
Awesome!
Completion rate improved to 2.33
Duplikaattien Poistaminen Distinct()-Menetelmällä
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 duplikaattielementit streamista.
Stream<T> distinct()
Tämä metodi palauttaa virran, joka sisältää vain yksilölliset alkiot, poistaen kaikki duplikaatit.
Miten se toimii
Metodi distinct() käyttää hashCode()-metodia havaitakseen 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 tasa-arvoisuus 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 avattiin koodin generointi -valikko (Alt + Insert Windows/Linux-järjestelmissä, Cmd + N Mac-järjestelmissä) ja valittiin equals() ja hashCode(). Kentät valittiin vertailua varten, minkä jälkeen 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 poistoon, 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 vertailemaan alkioita distinct()-menetelmässä?
2. Jos kahdella oliolla on sama hashCode(), mutta niiden equals()-menetelmä palauttaa false, pidetäänkö niitä samoina distinct()-menetelmässä?
Kiitos palautteestasi!