Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Comparable: Tietojen Luonnollinen Järjestys | Stream API:n Perusteet ja Toiminnalliset Ominaisuudet
Stream API

bookComparable: 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

Main.java

copy
1234567891011121314151617181920212223242526272829303132333435363738394041424344
package 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ä.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 8

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

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

Awesome!

Completion rate improved to 2.33

bookComparable: 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

Main.java

copy
1234567891011121314151617181920212223242526272829303132333435363738394041424344
package 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ä.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 8
some-alt