Taulukot Jukka Harju, Jukka Juslin 2006 1
Taulukot Taulukot ovat olioita, jotka auttavat organisoimaan suuria määriä tietoa. Käsittelylistalla on: Taulukon tekeminen ja käyttö Rajojen tarkastus ja kapasiteetti Taulukot, jotka tallettavat olioviittauksia Vaihtuvamittaiset parametrilistat Jukka Harju, Jukka Juslin 2006 2
Missä ollaan? Taulukoiden luonti ja käyttö Oliotaulukot Vaihtelevan pituiset parametrilistat Jukka Harju, Jukka Juslin 2006 3
Taulukko Taulukko on järjestetty lista arvoja Taulukolla on nimi (viittausmuuttujan nimi) Jokaisella arvolla on numeerinen indeksi 0 1 2 3 4 5 6 7 8 9 pisteet 15 87 94 82 67 98 87 81 74 91 Taulukko, jonka koko on N-solua indeksoidaan nollasta indeksiin N-1 asti. Yo taulukko sisältää 10 solua, jotka on indeksoitu 0:sta 9:ään Jukka Harju, Jukka Juslin 2006 4
Taulukot Tiettyyn arvoon taulukossa viitataan käyttämällä taulukon nimeä, jota seuraa indeksin numero hakasulkeissa. Esimerkiksi: pisteet[2] viittaa arvoon 94 (kolmas arvo taulukossa). Indeksi viittaa soluun, johon tallennetaan esimerkin taulukossa yksi int-tyyppinen arvo Jukka Harju, Jukka Juslin 2006 5
Taulukot Taulukon soluun voidaan tallentaa arvo, solun sisältö voidaan tulostaa tai solua 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 Harju, Jukka Juslin 2006 6
Taulukot Taulukon kaikkien solujen tietotyyppi on sama. Solun tyyppi voi olla primitiivityyppi tai viittausmuuttuja. Taulukko voidaan luoda sisältämään esimerkiksi inttyyppistä tietoa, merkkejä, merkkijonoja (viittauksia String -luokan olioihin), viittauksia Kolikko luokan olioihin yms. Javassa taulukko itse on olio. Jukka Harju, Jukka Juslin 2006 7
Taulukon luonti pisteet-taulukko voidaan luoda seuraavasti: int[] pisteet = new int[10]; Muuttujan pisteet tyyppi on int[] (solun tyyppi on int, []-merkit kertovat kyseessä olevan taulukon). Huomaa, että taulukon tyyppi ei määrää taulukon kokoa, vaan jokaiselle taulukko-oliolle annetaan oma koko. Viittausmuuttuja pisteet asetetaan osoittamaan uuteen taulukko-olioon, joka pystyy säilyttämään 10 int-tyyppistä tietoa. Jukka Harju, Jukka Juslin 2006 8
Taulukkojen luonti Muutamia muita esimerkkejä taulukon luonnista: float[] hinnat = new float[500]; boolean[] vivut; vivut = new boolean[20]; char[] merkit = new char[1750]; Jukka Harju, Jukka Juslin 2006 9
Taulukkojen käyttö Java SE 5:n Iterator-luokka helpottaa taulukon elementtien läpikäyntiä: for (int piste : pisteet) { System.out.println (piste); } Enimmäkseen käytetään kuitenkin for-toistorakennetta taulukon läpikäyntiin: for (int i=0; i<pisteet.length; i++) { System.out.println(pisteet[i]); } Jukka Harju, Jukka Juslin 2006 10
Taulukon rajojen tarkistaminen Kun taulukko on luotu, sillä on kiinnitetty koko, jota ei voida enää muuttaa. Indeksin, jolla viitataan taulukon soluun, täytyy olla taulukon rajojen sisällä. Toisin sanoen indeksin arvon pitää olla >= 0 ja <N (taulukon koko). Java kääntäjä heittää ArrayIndexOutOfBoundsExceptionluokan poikkeuksen, jos taulukon indeksin on rajojen ulkopuolella. Tätä kutsutaan automaattiseksi rajojen tarkistamiseksi. Jukka Harju, Jukka Juslin 2006 11
Rajojen tarkistus Esimerkiksi taulukon merkit koko on 100, mutta indeksi laskuri saa liikkua vain välillä 0-99. Jos laskurin arvo on 100, silloin seuraava viittaus aiheuttaa poikkeuksen heittämisen: System.out.println(merkit[laskuri]); On tyypillistä tehdä ns. off-by-one virheitä taulukkoja käytettäessä. ongelma for (int i=0; i <= 100; i++) { merkit[i] = i*50 + epsilon; } Jukka Harju, Jukka Juslin 2006 12
Rajojen tarkistus Jokaisella taulukko-oliolla on julkinen vakioattribuutti nimeltään length, joka sisältää taulukon koon. Tähän viitataan taulukon nimen kautta käyttäen length-attribuuttia, ei esim. getlength-metodia: int pituus = pisteet.length; Huomaa, että length sisältää solujen lukumäärän eikä suurinta sallittua indeksinumeroa. Jukka Harju, Jukka Juslin 2006 13
Toinen taulukon luontitapa Hakasulkeet taulukon tyypissä voidaan kirjoittaa taulukon tietotyypin tai nimen jälkeen. Seuraavat kaksi lausetta ovat merkitykseltään identtiset: float[] hinnat; float hinnat[]; Ensimmäinen tapa on helpommin luettava ja suositeltava. Jukka Harju, Jukka Juslin 2006 14
Alustuslistat Alustuslistaa voidaan käyttää arvojen sijoittamisessa taulukkoon sen luontivaiheessa. Arvot kirjoitetaan aaltosulkeisiin pilkulla erotettuina. Esimerkkejä: int[] yksikot = {147, 323, 89, 933, 540, 269, 97, 114, 298, 476}; char[] arvosanat = {'1', '2', '3', '4', '5'}; Jukka Harju, Jukka Juslin 2006 15
Alustuslistat Huomaa, että kun käytetään alustuslistaa: Ei käytetä new-operaattoria Taulukon kokoa ei määritellä Taulukon koko määrittyy automaattisesti sen mukaan kuinka monta arvoa alustuslistassa on. Alustuslistaa voidaan käyttää vain taulukon luonnin yhteydessä. Jukka Harju, Jukka Juslin 2006 16
Taulukko parametrina Koko taulukko voidaan välittää parametrina metodille. Kuten mikä tahansa muun olion kanssa, viittaus taulukkoon (eli olioon) välitetään metodille. Kun taulukkoa muutetaan metodin sisällä näkyvät muutokset myös kutsuneeseen metodiin. Taulukkoa ei siis ole tarpeen palauttaa metodista. Myös yksittäinen taulukon solu voidaan välittää metodille, kunhan solun tyyppi vastaa metodin parametrimuuttujan tyyppiä. Jukka Harju, Jukka Juslin 2006 17
Missä ollaan? Taulukoiden luonti ja käyttö Oliotaulukot Vaihtelevan pituiset parametrilistat Jukka Harju, Jukka Juslin 2006 18
Oliotaulukot Taulukon elementit voivat olla viittausmuuttujia. Seuraava lause varaa tilaa viidelle viittausmuuttujalle, jotka viittaavat String-luokan olioihin: String[] sanat = new String[5]; Yo lause ei luo String olioita. Taulukko sisältää null alkuarvoja. Olio, joka tallennetaan taulukkoon täytyy erikseen luoda. Jukka Harju, Jukka Juslin 2006 19
Oliotaulukko sanat-taulukko alkuarvoisessa tilanteessa: sanat null null null null null Seuraava käyttöyritys heittäisi NullPointerException:in: System.out.println (sanat[0]); Jukka Harju, Jukka Juslin 2006 20
Oliotaulukot Sen jälkeen kun muutamia String-olioita on luotu ja tallennettu taulukkoon: sanat null null "hauskuus" "luonti" "nopeus" Jukka Harju, Jukka Juslin 2006 21
Oliotaulukot String-olioita voidaan luoda käyttäen vakiomerkkijonoja. Seuraava lause luo taulukko-olion, jonka nimi on verbit ja täyttää sen neljällä String-oliolla. String[] verbit = {"leiki", "työskentele", "syö", "nuku"}; Jukka Harju, Jukka Juslin 2006 22
Komentoriviargumentit main-metodin määrittelystä havaitaan, että metodi saa parametrina String-tyyppisen taulukon. Taulukon arvot ovat peräisin komentoriviargumenteista, jotka annetaan ohjelmalle käynnistyksen yhteydessä. Esimerkiksi seuraava komento välittää kaksi String - oliota main-metodille: > java ohjelma uskomaton kiva Nämä merkkijonot tallennetaan indeksien 0-1 paikalle main-metodin parametritaulukkoon. Jukka Harju, Jukka Juslin 2006 23
Missä ollaan? Taulukoiden luonti ja käyttö Oliotaulukot Vaihtelevan pituiset parametrilistat Jukka Harju, Jukka Juslin 2006 24
Vaihtelevan mittaiset parametrilistat Olettaen, että halutaan tehdä metodi, joka käsittelee vaihtelevan mittaisen määrän parametreja kutsun mukaan. Esimerkki: Halutaan luoda metodi keskiarvo, joka palauttaa intparametrien keskiarvon. // 1. metodikutsu (neljä lukua) keskiarvo1 = keskiarvo(3, 5, 1, 2); // 2. metodikutsu (kolme lukua) keskiarvo2 = keskiarvo(3, 5, 1); Jukka Harju, Jukka Juslin 2006 25
Vaihtelevan mittaiset parametrilistat keskiarvo-metodi voitaisiin ylikuormittaa. Huono puoli: tarvitsisimme erikseen eri version metodista jokaiselle parametrilistan sallitulle pituudelle. Voitaisiin määrittää metodi, joka saa parametrina inttyyppisen taulukon. Huono puoli: taulukko täytyisi luoda ja tallentaa muuttujat taulukkoon, ennen metodin kutsumista Java SE 5 tarjoaa kätevän tavan luoda muuttuvan pituisia parametrilistoja. Jukka Harju, Jukka Juslin 2006 26
Vaihtelevan mittaiset parametrilistat Käyttäen parametrien määrittelyssä seuraavaa syntaksia, voidaan metodi määritellä vastaanottamaan mikä tahansa määrä samantyyppisiä parametreja. Jokaisella kutsulla, parametrit sijoitetaan automaattisesti taulukkoon, jotta ne pystytään helposti prosessoimaan. Ilmoittaa että kyseessä on vaihtelevan pituinen lista public double keskiarvo(int... lista) { // toiminnot } solun tyyppi taulukon nimi Jukka Harju, Jukka Juslin 2006 27
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) summa / lista.length; } } return tulos; Jukka Harju, Jukka Juslin 2006 28
Vaihtelevan mittaiset parametrilistat Parametrin tyyppi voi olla mikä tahansa primitiivityyppi tai viittausmuuttuja. public void tulosta arvosanat (Arvosana... arvosanat) { for (Arvosana numero : arvosanat) { System.out.println(numero); } } Jukka Harju, Jukka Juslin 2006 29
Vaihtelevan mittaiset parametrilistat Metodi, joka ottaa vastaan vaihtelevan määrän parametreja, voi myös ottaa vastaan muita parametreja. Seuraava metodi ottaa vastaan yhden int-parametrin, yhden String-parametrin ja vaihtelevan mittaisen määrän double - tyyppisiä parametreja. public void testi (int laskuri, String nimi, double... numerot) { // toiminnot } Jukka Harju, Jukka Juslin 2006 30
Vaihtelevan mittaiset parametrilistat Vaihtelevan mittainen parametrilista pitää olla metodin määrittelyssä viimeisenä. Yksi metodi ei voi ottaa vastaan vaihtelevan mittaista parametrilistaa. Myös konstruktorit voivat ottaa vastaan vaihtelevan mittaisia parametrilistoja. Jukka Harju, Jukka Juslin 2006 31