Java: Comparable ja hieman Collectionsia

Comparable on Javan rajapinta Collection luokan olioille. Javan listarakenteista esimerkiksi TreeSet järjestyy ns. luonnolliseen järjestykseen.

TreeSet<String> sanat=new TreeSet<String>();
sanat.add("Neljä");
sanat.add("Kaksi");
sanat.add("Kolme");
sanat.add("Auto");

// TreeSet järjestyy automaattisesti luonnolliseen järjestykseen
for (String s : sanat){
	System.out.println(s);
}

Ylläoleva ohjelma tulostaisi TreeSettiin lisätyt String-oliot aakkosjärjestyksessä automaattisesti:

Auto
Kaksi
Kolme
Neljä

Sen sijaan ArrayListiin sijoitetut oliot tulostuisivat siinä järjestyksessä jossa ne on listalle sijoitettu:

ArrayList<Henkilo> arrayPerhe = new ArrayList<Henkilo>();
arrayPerhe.add(new Henkilo("Pekka", 5));
arrayPerhe.add(new Henkilo("Liisa", 1));
arrayPerhe.add(new Henkilo("Lasse", 8));
arrayPerhe.add(new Henkilo("Isä", 33));
arrayPerhe.add(new Henkilo("Äiti", 32));

		
System.out.println("\nArrayList Perhe koodatussa järjestyksessä:");
for (Henkilo x : arrayPerhe){
	System.out.println(x);
}
ArrayList Perhe koodatussa järjestyksessä:
Pekka 5
Liisa 1
Lasse 8
Isä 33
Äiti 32

Entäpä jos sijoitamme TreeSettiin olioita joilla on monia ominaisuuksia? Esimerkki perheestä haluaisimme sijoittaa olioihin paljon muutakin tietoa kuin nimen ja iän ja järjestää listan esimerkiksi koulun päästötodistuksen mukaisesti?

Järjestyksen voi itse määritellä Comparablen avulla joka vaatii metodin int compareTo() kirjoittamista. Esimerkiksi TreeSet ottaa ylikirjoitetun compareTo() metodin automaattisesti huomioon, mutta ArrayList vaatii Collections.sort() metodin käyttöä.

compareTo() metodi saa viitteen toiseen samanlaiseen olioon johon vertailu tulee suorittaa. Vertailun tulos palautetaan kokonaislukuna väliltä -1 – 1:

/* Luokasta Henkilo
 * Comparable-rajapinnan abstrakti metodi
 * tulee ylikirjoittaa
 */
@Override
public int compareTo(Henkilo h) {
        if(this.getIka() < h.getIka()) { // pienempi
		return -1;
	}
	if(this.getIka() == h.getIka()) { // samansuuruinen
		return 0;
	}
	return 1; // isompi
}

Nyt jos käytämme arrayPerheen Collections.sort(arrayPerhe) metodissa, saamme ikään perustuvan järjestyksen.

System.out.println("\nArrayList Perhe koodatussa compareTo() järjestyksessä:");
// ArrayList tarvitsee luokan Collections sort() metodia järjestäytymiseen,
// vaikka Henkilo luokassa on compareTo() metodi luotuna
Collections.sort(arrayPerhe);

for (Henkilo x : arrayPerhe){
	System.out.println(x);
}

tulostus on:

ArrayList Perhe compareTo() järjestyksessä:
Liisa 1
Pekka 5
Lasse 8
Äiti 32
Isä 33

Tässä pieni esimerkki ohjelma Comparablen käytöstä ComparableEsimerkki.zip Eclipse projektina.

Advertisements

Vastaa

Täytä tietosi alle tai klikkaa kuvaketta kirjautuaksesi sisään:

WordPress.com-logo

Olet kommentoimassa WordPress.com -tilin nimissä. Log Out / Muuta )

Twitter-kuva

Olet kommentoimassa Twitter -tilin nimissä. Log Out / Muuta )

Facebook-kuva

Olet kommentoimassa Facebook -tilin nimissä. Log Out / Muuta )

Google+ photo

Olet kommentoimassa Google+ -tilin nimissä. Log Out / Muuta )

Muodostetaan yhteyttä palveluun %s