Comparable: Tietojen Luonnollinen Järjestys
Javassa on yleistä tarvetta lajitella olioita. Esimerkiksi kirjojen listassa saatetaan haluta lajitella ne nimen, kirjoittajan tai julkaisuvuoden mukaan.
Tällaisten tehtävien käsittelemiseksi Java tarjoaa Comparable- ja Comparator-rajapinnat. Molemmat saavuttavat saman tavoitteen (olioiden lajittelu), mutta eri tavoilla. Tarkastellaan niitä yksitellen.
Mikä on Comparable?
Esimerkiksi Java-merkkijonot lajitellaan oletuksena aakkosjärjestykseen, koska String-luokka toteuttaa Comparable-rajapinnan.
Keskeinen metodi Comparable-funktionaalisessa rajapinnassa on:
int compareTo(T o);
Tämä metodi palauttaa:
- Negatiivinen luku, jos nykyinen olio on pienempi kuin annettu olio;
- Nolla, jos oliot ovat yhtä suuret;
- Positiivinen luku, jos nykyinen olio on suurempi kuin annettu olio.
Esimerkki: Kirjojen lajittelu julkaisuvuoden mukaan
Oletetaan, että haluat verrata Book-olioita niiden julkaisuvuoden perusteella.
Tämän saavuttamiseksi Book-luokka voi toteuttaa Comparable-rajapinnan ja ylikirjoittaa compareTo-metodin. Ylikirjoittamalla tämän metodin määrittelet, miten Book-oliot vertaillaan, mikä vaikuttaa suoraan lajittelukäyttäytymiseen esimerkiksi Collections.sort()-menetelmässä.
Tämän avulla voidaan hallita kirjojen järjestystä lajittelussa—onko se nouseva vai laskeva—perustuen compareTo-metodiin toteutettuun logiikkaan.
Main.java
1234567891011121314151617181920212223242526272829303132333435363738394041424344package com.example; import java.util.List; import java.util.ArrayList; import java.util.Collections; public class Main { public static void main(String[] args) { List<Book> books = new ArrayList<>(); books.add(new Book("Book A", "Author X", 2020)); books.add(new Book("Book B", "Author Y", 2018)); books.add(new Book("Book C", "Author Z", 2021)); Collections.sort(books); // Uses `compareTo` System.out.println(books); } } class Book implements Comparable<Book> { private String title; private String author; private int year; public Book(String title, String author, int year) { this.title = title; this.author = author; this.year = year; } public int getYear() { return year; } @Override public int compareTo(Book other) { return Integer.compare(this.year, other.year); // Compare by publication year } @Override public String toString() { return title + " (" + year + ")"; } }
Kun Collections.sort(books) kutsutaan, Java iteroi listan läpi vertaillen alkioita compareTo-luokassa määritellyn Book-metodin avulla.
Jokaisessa vertailussa compareTo palauttaa numeerisen arvon, joka määrittää kahden kirjan järjestyksen. Näiden arvojen perusteella lajittelualgoritmi järjestää alkiot siten, että ne ovat nousevassa julkaisuvuoden mukaisessa järjestyksessä.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Awesome!
Completion rate improved to 2.33
Comparable: Tietojen Luonnollinen Järjestys
Pyyhkäise näyttääksesi valikon
Javassa on yleistä tarvetta lajitella olioita. Esimerkiksi kirjojen listassa saatetaan haluta lajitella ne nimen, kirjoittajan tai julkaisuvuoden mukaan.
Tällaisten tehtävien käsittelemiseksi Java tarjoaa Comparable- ja Comparator-rajapinnat. Molemmat saavuttavat saman tavoitteen (olioiden lajittelu), mutta eri tavoilla. Tarkastellaan niitä yksitellen.
Mikä on Comparable?
Esimerkiksi Java-merkkijonot lajitellaan oletuksena aakkosjärjestykseen, koska String-luokka toteuttaa Comparable-rajapinnan.
Keskeinen metodi Comparable-funktionaalisessa rajapinnassa on:
int compareTo(T o);
Tämä metodi palauttaa:
- Negatiivinen luku, jos nykyinen olio on pienempi kuin annettu olio;
- Nolla, jos oliot ovat yhtä suuret;
- Positiivinen luku, jos nykyinen olio on suurempi kuin annettu olio.
Esimerkki: Kirjojen lajittelu julkaisuvuoden mukaan
Oletetaan, että haluat verrata Book-olioita niiden julkaisuvuoden perusteella.
Tämän saavuttamiseksi Book-luokka voi toteuttaa Comparable-rajapinnan ja ylikirjoittaa compareTo-metodin. Ylikirjoittamalla tämän metodin määrittelet, miten Book-oliot vertaillaan, mikä vaikuttaa suoraan lajittelukäyttäytymiseen esimerkiksi Collections.sort()-menetelmässä.
Tämän avulla voidaan hallita kirjojen järjestystä lajittelussa—onko se nouseva vai laskeva—perustuen compareTo-metodiin toteutettuun logiikkaan.
Main.java
1234567891011121314151617181920212223242526272829303132333435363738394041424344package com.example; import java.util.List; import java.util.ArrayList; import java.util.Collections; public class Main { public static void main(String[] args) { List<Book> books = new ArrayList<>(); books.add(new Book("Book A", "Author X", 2020)); books.add(new Book("Book B", "Author Y", 2018)); books.add(new Book("Book C", "Author Z", 2021)); Collections.sort(books); // Uses `compareTo` System.out.println(books); } } class Book implements Comparable<Book> { private String title; private String author; private int year; public Book(String title, String author, int year) { this.title = title; this.author = author; this.year = year; } public int getYear() { return year; } @Override public int compareTo(Book other) { return Integer.compare(this.year, other.year); // Compare by publication year } @Override public String toString() { return title + " (" + year + ")"; } }
Kun Collections.sort(books) kutsutaan, Java iteroi listan läpi vertaillen alkioita compareTo-luokassa määritellyn Book-metodin avulla.
Jokaisessa vertailussa compareTo palauttaa numeerisen arvon, joka määrittää kahden kirjan järjestyksen. Näiden arvojen perusteella lajittelualgoritmi järjestää alkiot siten, että ne ovat nousevassa julkaisuvuoden mukaisessa järjestyksessä.
Kiitos palautteestasi!