Comparable: Datan Luonnollinen Järjestys
Pyyhkäise näyttääksesi valikon
Java-kielessä on yleistä tarvita olioiden lajittelua. 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 tavoin. 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 vertailla 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()-metodissa.
Tämän avulla voidaan hallita kirjojen järjestystä lajittelussa—onko se nouseva vai laskeva—riippuen siitä, millaisen logiikan toteutat compareTo-metodissa.
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 läpi listan vertaillen alkioita compareTo-metodin avulla, joka on määritelty Book-luokassa.
Jokaisessa vertailussa compareTo palauttaa numeerisen arvon, joka määrittää kahden kirjan järjestyksen. Näiden arvojen perusteella lajittelualgoritmi järjestää alkiot niin, 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