Java: Comparator

Comparator rajapinnan avulla voidaan toteuttaa halutunlaisia vertailuja listarakenteisiin sijoitettujen olioiden kesken. Siinä missä comparable rajapinnan käyttö vaatii meitä luomaan compareTo medotin jokaisen olion sisään, annetaan Comparatorissa vertailuun käytettävä luokka parametrina vaikka TreeSetin luomisen yhteydessä.

Rakennetaanpa pieni ohjelma. Ensin yksinkertainen Henkilö-luokka jonka avulla luomme perheen.

public class Henkilo {
	private String nimi;
	private int ika;
	
	public Henkilo(String nimi, int ika) {
		this.nimi = nimi;
		this.ika = ika;
	}
	
	public String getNimi() {
		return this.nimi;
	}
	public int getIka() {
		return this.ika;
	}
	public String toString() {
		return this.nimi + " " + this.ika;
	}
}

Seuraavaksi luomme luokan joka käyttää Comparator-rajapintaa ja toteuttaa sen vaatiman metodin compare(object, object).

import java.util.Comparator;

public class IkaLajittelu implements Comparator{
	
	@Override
	public int compare(Henkilo h0, Henkilo h1) {
		if (h0.getIka() == h1.getIka()) return 0;
		if (h0.getIka() < h1.getIka()) return -1;
		return 1;
	}
}

Lopuksi vielä pääohjelma jossa luomme TreeSetin käyttäen siinä IkaLajittelua ja lisäten muutaman perheen jäsenen.

import java.util.TreeSet;
public class ComparatorEsimerkki {

	public static void main(String[] args) {

		TreeSet perhe = new TreeSet(new IkaLajittelu());
		//TreeSet perhe = new TreeSet(new IkaLajittelu());
		perhe.add(new Henkilo("Lasse" , 6));
		perhe.add(new Henkilo("Liisa" , 5));
		perhe.add(new Henkilo("Kalle" , 18));
		perhe.add(new Henkilo("Isä" , 45));
		perhe.add(new Henkilo("Äiti" , 44));
		
		System.out.println("Perheen koko: " + perhe.size());
		System.out.println(perhe);
	}
}

Ohjelman tulostus on

Perheen koko: 5
[Liisa 5, Lasse 6, Kalle 18, Äiti 44, Isä 45]

Jos emme olisi käyttäneet Comparator rajapintaa, olisi TreeSet järjestänyt oliot luonnolliseen järjestykseen nimien perusteella.

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