Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

Taulukot Jukka Juslin © Jukka Juslin 2006.

Samankaltaiset esitykset


Esitys aiheesta: "Taulukot Jukka Juslin © Jukka Juslin 2006."— Esityksen transkriptio:

1 Taulukot Jukka Juslin © Jukka Juslin 2006

2 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

3 Missä ollaan? Taulukoiden luonti ja käyttö Oliotaulukot
Vaihtelevan pituiset parametrilistat Kaksiulotteiset taulukot ArrayList luokka © Jukka Juslin 2006

4 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 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

5 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

6 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

7 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

8 Taulukot Toinen tapa kuvata pisteet taulukkoa: 79 87 94 82 67 98 81 74
91 © Jukka Juslin 2006

9 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

10 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

11 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

12 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

13 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

14 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

15 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

16 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

17 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

18 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

19 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

20 Missä ollaan? Taulukoiden luonti ja käyttö Oliotaulukko
Vaihtelevan mittaiset parametrilistat Kaksiulotteiset taulukot ArrayList luokka © Jukka Juslin 2006

21 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

22 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

23 Oliotaulukot Sen jälkeen kun muutamia String olioita on luotu ja talletettu taulukkoon: “hauskuus” sanat - “luonti” “nopeus” © Jukka Juslin 2006

24 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

25 Oliotaulukot Seuraavaksi katsomme esimerkkijä, joka ylläpitää joukkoa CD olioita © Jukka Juslin 2006

26 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

27 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

28 Missä ollaan? Taulukkojen luonti ja käyttö Oliotaulukot
EXTRA: Vaihtelevanmittaiset parametrilistat Kaksiulotteiset taulukot ArrayList luokka © Jukka Juslin 2006

29 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

30 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

31 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

32 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

33 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

34 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

35 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

36 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

37 Missä ollaan? Taulukkojen luonti ja käyttö Oliotaulukot
Vaihtelevan mittaiset parametrilistat Kaksiulotteiset taulukot ArrayList luokka © Jukka Juslin 2006

38 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

39 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

40 Kaksiulotteinen taulukko
Lause Tyyppi Kuvaus taulukko int[][] 2D taulukko integereitä taulukko[5] int[] Integer taulukko taulukko[5][12] int integer © Jukka Juslin 2006

41 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

42 Moniulotteiset taulukot
Seuraavassa kolmiulotteinen (vrt. rahan laskeminen taulukoissa, taloushallinto) osastot lähiesimiehet budjetit © Jukka Juslin 2006

43 Missä ollaan? Taulukkojen luonti ja käyttö Oliotaulukot
Vaihtelevan pituiset parametrilistat Kaksiulotteiset taulukot ArrayList luokka © Jukka Juslin 2006

44 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

45 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

46 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

47 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

48 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


Lataa ppt "Taulukot Jukka Juslin © Jukka Juslin 2006."

Samankaltaiset esitykset


Iklan oleh Google