Kuulutko joukkoon?

Matemaattisesti joukko on ”toisistaan erotettavien objektien (olioiden) yhdistelmä” [1]. Joukko voi olla vaikka ihmisjoukko, kokonaislukujoukko tai suomenlapinkoirajoukko :hopeanuoli:. Javassa joukko ei ole mikään hämärä käsite – ”rakas” ohjelmointikielemme tuntee samat eksaktit käsitteet kuin matematiikkakin: leikkaus (intersection), erotus (difference) ja yhdiste (union). Itse asiassa Javan joukko jäljittelee matemaattisen joukko-käsitteen mallia.

Joukot ovat tuttuja otuksia Java-kotitehtävistä. Javassa joukoilla on joskus varsin näppäräksi osoittautuva ominaisuus: ne ottavat alkiokseen vain yhden identtisen alkion, joten ne sopivat hyvin vaikkapa mallintamaan sienikoria. Eihän kukaan sienestäjä nyt kahta saman sienilajin sientä poimisi, eihän? Mikäli joukko sisältää jo alkion ”kanttarelli”, ei toista samannimistä alkiota ”kanttarelli” huolita enää mukaan. Tietysti jos näiden herkullisuus-arvo on eriävä, niin silloin tarkkasilmäinen sienestäjä huomaa eron ja kelpuuttaa tämän henkilökohtaiseen sienikori-joukkoonsa.

Samassa joukossa ei siis voi olla alkioita a ja b siten että a.equals(b); on tosi [2]. Kaksi joukkoa ovat ekvivalentit (samat) jos ne sisältävät samat alkiot.

Java.util.Set on rajapinnan Collection<E> alirajapinta. Itse asiassa Set on kokoelma, joka toteuttaa ainoastaan Collectionin metodit sisältäen samalla tupla-alkioiden eston [2]. Set-rajapinnan toteuttavia joukkoja ovat mm. TreeSet, HashSet ja LinkedHashSet. Set-rajapinta ei määrittele joukolle mitään tiettyä järjestystä. Jos on tarve käyttää joukkoa ja järjestää alkiot tiettyyn järjestykseen, tarvitaan SortedSet-rajapinnan toteuttava joukko. Joillakin Setin toteutuksilla on tietynlaisia rajoitteita lisättäville alkioille, esim. jotkut joukot eivät ota alkioikseen null-arvoja[2].

HashSet on monipuolinen tietorakenne. Jos nyt haluaisimme luoda vaikkapa tällaisen HashSetin, voimme lausua taikasanat:

Set<NoJaa> blaa = new HashSet<NoJaa>();

Tämä joukko ottaa alkioikseen ainoastaan NoJaa-luokan (ja sen jälkeläisluokkien) ilmentymiä.

Koska Javan joukko toteuttaa Collection-rajapinnan, kaikki tutut tietorakenne-metodit ovat käytössä. Voidaan lisätä (add) tai poistaa alkioita (remove) tai tarkistaa, sisältääkö joukko tietyn alkion(contains). Joukon läpikäymiseen tarvitaan erillinen iteraattori-olio, mutta se on pieni miinus ottaen huomioon joukon helppokäyttöisyyden ja monipuolisuuden tietorakenteena.

– Teemu

[1] Joukko-oppi, Wikipedia
[2] Java API SE 5.0: Set

0 Responses to “Kuulutko joukkoon?”



  1. Jätä kommentti

Vastaa

Please log in using one of these methods to post your comment:

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





%d bloggers like this: