Taulukot Jukka Juslin © Jukka Juslin 2006
Taulukot Taulukot ovat olioita, jotka auttavat meitä organisoimaan suuria määriä tietoa Seuraavassa keskitymme näihin: Taulukon tekeminen ja käyttö Rajojen tarkastus ja kapasiteetti Taulukot, jotka tallettavat olioviittauksia Vaihtuvanmittaiset parametrilistat Monidimensioiset taulukot ArrayList luokka © Jukka Juslin 2006
Missä ollaan? Taulukoiden luonti ja käyttö Oliotaulukot Vaihtelevan pituiset parametrilistat Kaksiulotteiset taulukot ArrayList luokka © Jukka Juslin 2006
Koko taulukolla on yksi nimi Jokaisella arvolla on numeerinen indeksi Taulukko Taulukko on järjestetty lista arvoja pisteet Koko taulukolla on yksi nimi Jokaisella arvolla on numeerinen indeksi 0 1 2 3 4 5 6 7 8 9 79 87 94 82 67 98 87 81 74 91 Taulukko, jonka koko on N indeksoidaan nollasta indeksiin N-1 asti Tämä taulukko säilyttää 10 arvoa, jotka on indeksoitu 0:sta 9:ään © Jukka Juslin 2006
Taulukot Tiettyyn arvoon taulukossa viitataan käyttämällä taulukon nimeä, jota seuraa indeksin numero hakasulkeissa Esimerkiksi tämä: pisteet[2]; viittaa arvoon 94 (kolmas arvo taulukossa) Indeksi viittaa paikkaan, johon talletetaan tässä yksi int-tyyppinen arvo © Jukka Juslin 2006
Taulukot Esimerkiksi, taulukon elementtiin voidaan tallettaa arvo, elementti voidaan tulostaa tai elementtiä voidaan käyttää laskutoimituksessa: pisteet[2] = 89; pisteet[eka] = pisteet[eka] + 2; keskiarvo = (pisteet[0] + pisteet[1])/2; System.out.println (“Huippu = " + pisteet[5]); © Jukka Juslin 2006
Taulukot Arvoja, joita pidetään taulukossa, kutsutaan taulukon elementeiksi tai alkioiksi Taulukko tallettaa monta arvoa samaa tyyppiä olevia elementtejä – alkion tai elementin tyyppi Elementin tyyppi voi olla primitiivityyppi tai olioviittaus Siksi, me voimme luoda taulukon int-muuttujista, taulukon merkeistä, taulukon String luokan olioista, taulukon Kolikko olioista yms. Javassa taulukko itse on olio, joka voidaan instantioida © Jukka Juslin 2006
Taulukot Toinen tapa kuvata pisteet taulukkoa: 79 87 94 82 67 98 81 74 91 © Jukka Juslin 2006
int[] pisteet = new int[10]; Taulukkojen luonti pisteet taulukko voitaisin luoda kuten seuraavassa: int[] pisteet = new int[10]; Muuttujan pisteet tyyppi on int[] (taulukko int-arvoja) Huomaa, että tauluko tyyppinä ei määrää taulukon kokoa, vaan jokaiselle taulukkoluokan oliolle annetaan oma koko Viittausmuuttuja pisteet asetetaan osoittamaan uuteen taulukko-olioon, joka pystyy säilyttämään 10 int-tyyppistä muuttujaa © Jukka Juslin 2006
Taulukkojen luonti Muutamia muita esimerkkejä taulukon luonnista: float[] hinnat = new float[500]; boolean[] vivut; vivut = new boolean[20]; char[] koodit = new char[1750]; © Jukka Juslin 2006
Taulukkojen käyttö JDK 1.5:sen uusi iterator luokka helpottaa taulukon elementtien läpikäyntiä for (int piste : pisteet) System.out.println (piste); Me käytämme kuitenkin seuraavantyyppistä ratkaisua for (int i=0; i<pisteet.length; i++) System.out.println(pisteet[i]); © Jukka Juslin 2006
Taulukon rajojen tarkistaminen Kun taulukko on luotu, sillä on kiinitetty koko (myöhemmin kuulette kenties Vector-luokan olioista, jotka poistavat tämän rajoituksen) Indeksi, jolla viitataan taulukon elementtiin pitää kuulua taulukon rajojen sisään Siis, indeksin arvo pitää olla olla 0:sta N-1:seen Java kääntäjä heittää ArrayIndexOutOfBoundsException jos taulukon indeksin on rajojen ulkopuolella Tätä kutsutaan automaattiseksi rajojen tarkistamiseksi © Jukka Juslin 2006
Rajojen tarkistus Esimerkiksi taulukko koodit voi pitää 100 arvoa, mutta se indeksoidaan vain arvoista 0 arvoon 99 Jos laskurin arvo on 100, silloin seuraava viittaus aiheuttaa poikkeuksen heittämisen: System.out.println (koodit[laskuri]); On tyypillistä tehdä ns. off-by-one virheitä taulukkoja käytettäessä ongelma for (int index=0; index <= 100; index++) koodit[index] = index*50 + epsilon; © Jukka Juslin 2006
int pituus = pisteet.length; Rajojen tarkistus Jokaisella taulukko-oliolla on julkinen vakio nimeltään length, joka tallettaa taulukon koon Siihen viitataan taulukon nimen kautta käyttäen length-attribuuttia, ei getLength: int pituus = pisteet.length; Huomaa, että length säilyttää elementtien lukumäärää ei suurinta indeksinumeroa © Jukka Juslin 2006
Toinen taulukon luontitapa Hakasulkeet taulukon tyypissä voidaan laittaa taulukon nimen ennen tai jälkeen Siksi seuraavaksi kaksi lausetta ovat täysin samat merkitykseltään: float[] hinnat; float hinnat[]; Ensimmäinen formaatti on yleisesti helpommin luettava ja sitä pitäisi käyttää (vertaa public static void main lauseen eroihin!) © Jukka Juslin 2006
Taulukkojen sijoittaminen Taulukoita voidaan sijoittaa toiseen taulukkoon sijoitusoperaation avulla Luonnollisesti vain siinä tapauksessa, että sijoitettava taulukko mahtuu sijoituksen kohteeseen asiassa on järkeä Esim. pisteet = jukanPisteet; © Jukka Juslin 2006
Alustuslistat Alustuslistaa voidaan käytää taulukon luomisessa ja arvojen sijoittamisessa taulukkoon samantien Arvot ovat aaltosulkeiden välissä ja toisistaan erotetut pilkkujen avulla Esimerkkejä: int[] yksikot = {147, 323, 89, 933, 540, 269, 97, 114, 298, 476}; char[] arvosanat = {‘1', ‘2', ‘3', ‘4', ’5'}; © Jukka Juslin 2006
Alustuslistat Huomaa, että kun alustuslistaa käytetään: new operaattoria ei käytetä Taulukon kokoa ei määritellä ([5] yms) Taulukon koko määrittyy automaattisesti sen mukaan kuinka monta arvoa alustuslistassa on Alustuslistaa voidaan käyttää vain taulukon luonnin yhteydessä © Jukka Juslin 2006
Taulukot parametrinä Koko taulukko voidaan välittää parametrina metodille Kuten mikä tahansa muun olion kanssa, osoitin taulukkoon (eli olioon) välitetään metodille Kun taulukkoa muutetaan metodin sisällä myös alkuperäinen taulukko muuttuu (eli taulukko siellä mistä metodia on kutsuttu) tarpeen ei siis ole palauttaa taulukkoa metodista Yksittäinen taulukon alkio voidaan välittää metodille myös, jossa tapauksessa alkion tyypin tulee vastata metodin vastaanottamaa tyyppiä (formal ja actual parameters) © Jukka Juslin 2006
Missä ollaan? Taulukoiden luonti ja käyttö Oliotaulukko Vaihtelevan mittaiset parametrilistat Kaksiulotteiset taulukot ArrayList luokka © Jukka Juslin 2006
String[] sanat = new String[5]; Oliotaulukot Taulukon elementit voivat olla olioviitteitä Seuraava lause varaa tilaa viidelle viittaukselle String luokan olioihin String[] sanat = new String[5]; Se ei luo String olioita itseään Alkuarvona taulukkoa pitää null referenssejä (konstruktori) Olio, joka on talletettu taulukkoon täytyy instantioida omassa paikassaan (new avainsana yms.) © Jukka Juslin 2006
System.out.println (sanat[0]); Oliotaulukko sanat taulukko alkuarvoisessa tilanteessa: sanat - Tässä kohdassa seuraava referenssi heittäisi NullPointerException:in: System.out.println (sanat[0]); © Jukka Juslin 2006
Oliotaulukot Sen jälkeen kun muutamia String olioita on luotu ja talletettu taulukkoon: “hauskuus” sanat - “luonti” “nopeus” © Jukka Juslin 2006
Oliotaulukot Pidä mielessäsi, että String olioita voidaan luoda käyttäen literaaleja Seuraava lause luo taulukko-olion, jonka nimi on verbit ja täyttää sen neljällä String oliolla käyttäen merkkijonoliteraaleja String[] verbit = {“leiki", “työskentele", “syö", “nuku"}; © Jukka Juslin 2006
Oliotaulukot Seuraavaksi katsomme esimerkkijä, joka ylläpitää joukkoa CD olioita © Jukka Juslin 2006
Luokkakaavio UML luokkakaavio Kappaleet ohjelmalle: * Kappaleet + main (args : String[]) : void CDKokoelma - kokoelma : CD[] - lukumäärä : int - yhteisHinta : double + lisaaCD (nimi : String, artist : String, hinta : double, kappaleMäärä : int) : void + toString() : String - kasvataKokoa() : void CD - nimi : String - artisti : String - hinta : double - kappaleMäärä : int * 1 © Jukka Juslin 2006
Komentorivi argumentit main metodin formaali määritelmä vihjaa, että että ko. Metodi ottaa String olioita parametrinä Nämä arvot tulevat komentorivi argumenteista jotka annetaan ohjelmalle kun ohjelma ajetaan Esimerkiksi seuraava kääntäjän kutsuminen välittää kaksi String oliota mainille: > java ese uskomaton kiva Nämä stringit talletetaan indeksien 0-1 paikalle main metodin Stringitaulukkoon © Jukka Juslin 2006
Missä ollaan? Taulukkojen luonti ja käyttö Oliotaulukot EXTRA: Vaihtelevanmittaiset parametrilistat Kaksiulotteiset taulukot ArrayList luokka © Jukka Juslin 2006
Vaihtelevan mittaiset parametrilistat Olettaen, että haluisimme tehdä metodin, joka käsittelee vaihtelevan mittaisen määrän parametrejä kutsun mukaan Esimerkiksi, jos luomme metodin, jonka nimi on keskiarvo, joka palauttaa tietyn integer parametrien keskiarvon // yksi kutsu etsiä keskiarvo (neljä lukua) keskiarvo1 = keskiarvo(3, 5, 1, 2); // toinen kutsu saada keskiarvo kolmesta keskiarvo2 = keskiarvo(3, 5, 1); © Jukka Juslin 2006
Vaihtelevan mittaiset parametrilistat Voisimme ns. ylikuormittaa keskiarvo metodin Huono puoli: tarvitsisimme erikseen eri version metodista jokaiselle parametrilistalle Voisimme määrittää metodin, joka ottaa vastaan integer taulukon Huono puoli: meidän täytyisi luoda taulukko ja tallettaa muuttujat ennenkuin metodia kutsutaan kullakin kerralla Tämä sijasta, Java JDK 1.5:sta lähtien tarjoaa mukavan tavan luoda muuttuvan pituisia parametrilistoja © Jukka Juslin 2006
Vaihtelevan pituiset parametrilistat Käyttäen tiettyä syntaksia formaalissaparametrilistassa, voimme määritellä metodin ottamaan vastaan minkä tahansa määrän parametrejä jotka ovat samantyyppisiä Jokaisella kutsulla, parametrit automaattisesti laitetaan taulukkoon, jotta pystytään helposti prosessoimaan parametrit metodissa Ilmoittaa että vaiht. pit. lista kyseessä public double keskiarvo(int ... lista) { // toiminnot } elementin tyyppi taulukon nimi © Jukka Juslin 2006
Vaihtelevan mittaiset parametrilistat Miksi esiteltiin edes koko asia? Opimme mikä on formaali parametri Tästä opimme, että public static void main määre ei ole mikään kiveen hakattu asia. Esimerkiksi seuraava toimii hyvin! public class Häkki { public static void main(String ... argsi) { System.out.println(argsi[0]); System.out.println("ict02d ok"); } © Jukka Juslin 2006
Vaihtelevan mittaiset parametrilistat public double keskiarvo (int ... lista) { double tulos = 0.0; if (lista.length != 0) int summa = 0; for (int numero : lista) summa += numero; tulos = (double)numero / lista.length; } return(tulos); // muista sulkeet tähän! © Jukka Juslin 2006
Vaihtelevan mittaiset parametrilistat Parametrin tyyppi voi olla mikä tahansa primitiivinen tai oma oliotyyppi public void tulosta arvosanat (Arvosana ... arvosanat) { for (Arvosana numero : arvosanat) System.out.println(numero); } © Jukka Juslin 2006
Vaihtelevan pituiset parametrilistat Metodi, joka ottaa vastaan vaihtelevan määrän parametrejä voi myös ottaa vastaan muita parametrejä Seuraava metodi ottaa vastaan yhden int arvon, yhden String olion, ja vaihtelevan mittaisen määrän double tyypisiä arvoja numerot nimiseen taulukkoon public void testi (int laskuri, String nimi, double ... numerot) { // toiminnot } © Jukka Juslin 2006
Muuttuvan pituiset parametrilistat Muuttuvanpituinen parametrilista pitää olla esim. Metodin määrittelyssä viimeisenä (formaalissa määrittelyssä) Yksi metodi ei voi ottaa vastaan kahta muuttuvan pituista parametrilistaa Konstruktorit voidaan myös asettaa niin, että ne ottavat parametrinä vaihtelevan pituisia parametrilistoja © Jukka Juslin 2006
Missä ollaan? Taulukkojen luonti ja käyttö Oliotaulukot Vaihtelevan mittaiset parametrilistat Kaksiulotteiset taulukot ArrayList luokka © Jukka Juslin 2006
Kaksiulotteiset taulukot yksiulotteinen taulukko tallettaa listan elementtejä kaksiulotteinen taulukko voidaan ajatella taulukkona elementtejä, niin kuin Excel ohjelmassa: taulukolla on rivit ja sarakkeet (rivit ja kolumnit) yksi ulottuvuus kaksi ulottuvuutta © Jukka Juslin 2006
Kaksiulotteiset taulukot Tarkastiottaen kaksiulotteinen taulukko on taulukko, joka sisältää taulukkoja Kaksiulotteinen taulukko luodaan määrittelemällä kunkin ulottuvuuden koko erikseen: int[][] pisteet = new int[22][3]; Taulukkoelementtiin viitataan käyttämällä kahta indeksiarvoa: arvosana = pisteet[3][2]; Taulukkoon, joka määritellään yhdellä rivillä voidaan viitata yhdellä indeksinumerolla © Jukka Juslin 2006
Kaksiulotteinen taulukko Lause Tyyppi Kuvaus taulukko int[][] 2D taulukko integereitä taulukko[5] int[] Integer taulukko taulukko[5][12] int integer © Jukka Juslin 2006
Moniulotteiset taulukot Taulukolla voi olla monta ulotteisuutta – jos sillä on enemmän kuin yksi ulottuvuus, sitä kutsutaan moniulotteiseksi taulukoksi Jokainen uluttuvuus muodostaa jokaisen arvon alle halutun kokoisen määrän arvoja. Esim. arvosanat[3][2] jossa indeksi kolmonen viittaisi opiskelijaan Matti ja numero kaksi siihen että poimitaan osion kolme arvosana Jokaisella ulottuvuudella on oma julkinen length vakionsa Koska jokainen ulottuvuus on taulukko taulukkoviittauksista, taulukot yhden ulottuvuuden sisällä voivat olla erimittaisia Näitä kutsutaan sillointällöin rosoisiksi taulukoiksi © Jukka Juslin 2006
Moniulotteiset taulukot Seuraavassa kolmiulotteinen (vrt. rahan laskeminen taulukoissa, taloushallinto) osastot lähiesimiehet budjetit © Jukka Juslin 2006
Missä ollaan? Taulukkojen luonti ja käyttö Oliotaulukot Vaihtelevan pituiset parametrilistat Kaksiulotteiset taulukot ArrayList luokka © Jukka Juslin 2006
ArrayList luokka ArrayList luokka on osa java.util pakettia Kuten taulukko, se voi tallettaa listan arvoja ja viitata kuhunkin käyttäen numeerista indeksiä Kuitenkin, et voi käyttää hakasulje merkintää ArrayList olion kanssa Lisäksi, ArrayList olio kasvaa ja kutistuu tarpeiden mukaan, säätäen kokoaan tilanteen vaatimuksia vastaavaksi © Jukka Juslin 2006
ArrayList luokka Elementtejä voidaan lisätä tai poistaa yhden metodin kutsulla Kun elementti lisätään, muut elementit “liikkuvat syrjään” tehdäkseen tilaa Yhtälailla, kun elementti poistetaan, lista “supistuu kasaan” sulkeakseen tyhjän kohdan Elementtien indeksit muuttuvat vastaavasti niin että esim. tyhjä kohta häviää © Jukka Juslin 2006
ArrayList<Suku> tapaaminen = new ArrayList<Suku>; ArrayList luokka ArrayList tallettaa viittauksia Object luokkaan, jolloin mahdollista on tallettaa minkä tahansalaisia olioita Voimme myös määritellä ArrayList olion hyväksymään vain tietyn tyyppisiä olioita Seuraava rivi luo ArrayList olion, joka tallettaa vain Suku tyyppisiä olioita ArrayList<Suku> tapaaminen = new ArrayList<Suku>; © Jukka Juslin 2006
ArrayListin tehokkuus ArrayList luokka on toteutettu käyttäen allaolevaa taulukkoa Taulukkoa manipuloidaan niin, että indeksit säilyvät jatkuvina kun elementtejä lisätään tai poistetaan Jos elementtejä lisätään ja poistetaan listan lopusta, prosessointi on suhteellisen tehokasta Kun elementtejä lisätään listan alkuun tai keskelle listaa jäljelläolevia elementtejä on siirrettävä © Jukka Juslin 2006
Yhteenveto Olemme käyneet läpi: Taulukon luonti ja käyttö Rajojen tarkistus ja tilavuus Taulukot olioreferenssien tallentajina (OID) Vaihtelevan pituiset parametrilistat Moniulotteiset taulukot ArrayList luokka © Jukka Juslin 2006