Kirjoittaja: Antti Laaksonen
Kirjoitettu: 07.06.2006 – 07.06.2006
Tagit: algoritmit, kirjaston käyttö, koodi näytille, vinkki
Tiedossa on ohjelmointikerhon jäsenten nimet ja iät. Nyt kerholaiset pitää järjestää iän mukaan vanhimmasta nuorimpaan. Jos kaksi jäsentä ovat samanikäisiä, järjestys valitaan kuitenkin nimen mukaan. Monissa ohjelmointikielissä valmiiseen järjestelyfunktioon on mahdollista liittää oma vertailufunktio tällaisen erikoisjärjestelyn toteuttamiseksi.
Tyypillisesti ohjelmointikielen järjestelyfunktio kutsuu omatekoista vertailufunktiota ja antaa sille parametreiksi kaksi taulukon alkiota, joiden keskinäinen järjestys täytyy saada selville sillä järjestelyn hetkellä. Yleisten järjestelyfunktioiden taustalla on juuri kahden taulukon alkion vertailu, vaikka itse järjestelytapoja on lukuisia.
Tässä on esimerkkiohjelmat C:llä (qsort) ja PHP:llä (usort). Molemmissa tapauksissa vertailufunktio palauttaa negatiivisen arvon, jos ensimmäinen parametri kuuluu jälkimmäisen eteen ja positiivisen arvon, jos jälkimmäinen parametri kuuluu ensimmäisen eteen. Palautusarvo nolla tarkoittaa, että parametrien järjestys on määrittelemätön.
C-esimerkki
#include <stdio.h> #include <stdlib.h> #include <string.h> struct JASEN { char nimi[10]; int ika; }; int vertailu(const void *a, const void *b) { struct JASEN *j1, *j2; /* muutetaan osoittimet oikeanmuotoisiksi */ j1 = (struct JASEN *)a; j2 = (struct JASEN *)b; /* jos iät ovat samat, vertaillaan nimiä */ if (j1->ika == j2->ika) { return strcmp(j1->nimi, j2->nimi); } else { return (j2->ika > j1->ika) ? 1 : -1; } } int main(void) { int i; struct JASEN kerho[5] = {{"Pekka", 10}, {"Tiina", 11}, {"Anna", 9}, {"Lauri", 10}, {"Kalle", 9}}; /* parametrit: järjesteltävä taulukko alkioiden määrä yhden alkion koko vertailufunktio */ qsort(kerho, 5, sizeof(struct JASEN), vertailu); for (i = 0; i < 5; i++) { printf("%s %i\n", kerho[i].nimi, kerho[i].ika); } return 0; }
PHP-esimerkki
<?php function vertailu($a, $b) { // jos iät ovat samat, vertaillaan nimiä if ($a[1] == $b[1]) { return strcmp($a[0], $b[0]); } else { return ($b[1] > $a[1]) ? 1 : -1; } } $kerho = array(array("Pekka", 10), array("Tiina", 11), array("Anna", 9), array("Lauri", 10), array("Kalle", 9)); usort($kerho, "vertailu"); foreach($kerho as $tiedot) { echo $tiedot[0] . " " . $tiedot[1] . "<br>"; } ?>