Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Comparable: Datan Luonnollinen Järjestys | Osio
Practice
Projects
Quizzes & Challenges
Visat
Challenges
/
Stream API Javassa

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

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 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ä.

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

Osio 1. Luku 8
some-alt