osio2 luento1 osa2 - Haaga-Helia...
Transcript of osio2 luento1 osa2 - Haaga-Helia...
© Jukka Juslin 1
Osio2:Taulukot
Jukka Juslin
© Jukka Juslin 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 kapasiteettiTaulukot, jotka tallettavat olioviittauksiaVaihtuvanmittaiset parametrilistatMonidimensioiset taulukotArrayList luokka
© Jukka Juslin 3
Missä ollaan?Taulukoiden luonti ja käyttö
Oliotaulukot
Vaihtelevan pituiset parametrilistat
Kaksiulotteiset taulukotArrayList luokka
© Jukka Juslin 4
Taulukko• Taulukko on järjestetty lista arvoja
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
pisteet
Koko taulukollaon yksi nimi
Jokaisella arvolla on numeerinen indeksi
Tämä taulukko säilyttää 10 arvoa, jotka on indeksoitu 0:sta 9:ään
© Jukka Juslin 5
Taulukot• Tiettyyn arvoon taulukossa viitataan käyttämällä
taulukon nimeä, jota seuraa indeksin numerohakasulkeissa
• Esimerkiksi tämä:
pisteet[2];
viittaa arvoon 94 (kolmas arvo taulukossa)
• Indeksi viittaa paikkaan, johon talletetaan tässäyksi int-tyyppinen arvo
© Jukka Juslin 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 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 luokanolioista, taulukon Kolikko olioista yms.
• Javassa taulukko itse on olio, joka voidaaninstantioida
© Jukka Juslin 8
Taulukot• Toinen tapa kuvata pisteet taulukkoa:
pisteet 79
87
94
82
67
98
87
81
74
91
© Jukka Juslin 9
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 uuteentaulukko-olioon, joka pystyy säilyttämään 10 int-tyyppistämuuttujaa
© Jukka Juslin 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 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 12
Taulukon rajojen tarkistaminen• Kun taulukko on luotu, sillä on kiinitetty koko
(myöhemmin kuulette kenties Vector-luokanolioista, 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 jostaulukon indeksin on rajojen ulkopuolella
• Tätä kutsutaan automaattiseksi rajojentarkistamiseksi
© Jukka Juslin 13
Rajojen tarkistus• Esimerkiksi taulukko koodit voi pitää 100 arvoa,
mutta se indeksoidaan vain arvoista 0 arvoon 99
• Jos laskurin arvo on 100, silloin seuraavaviittaus aiheuttaa poikkeuksen heittämisen:
System.out.println (koodit[laskuri]);
• On tyypillistä tehdä ns. off-by-one virheitätaulukkoja käytettäessä
for (int index=0; index <= 100; index++)koodit[index] = index*50 + epsilon;
ongelma
© Jukka Juslin 14
Rajojen tarkistus• Jokaisella taulukko-oliolla on julkinen vakio
nimeltään length, joka tallettaa taulukon koon
• Siihen viitataan taulukon nimen kautta käyttäenlength-attribuuttia, ei getLength:
int pituus = pisteet.length;
• Huomaa, että length säilyttää elementtienlukumäärää ei suurinta indeksinumeroa
© Jukka Juslin 15
Toinen taulukon luontitapa• Hakasulkeet taulukon tyypissä voidaan laittaa
taulukon nimen ennen tai jälkeen
• Siksi seuraavaksi kaksi lausetta ovat täysin samatmerkitykseltään:
float[] hinnat;
float hinnat[];
• Ensimmäinen formaatti on yleisesti helpomminluettava ja sitä pitäisi käyttää (vertaa public static void main lauseen eroihin!)
© Jukka Juslin 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 17
Alustuslistat• Alustuslistaa voidaan käytää taulukon luomisessa
ja arvojen sijoittamisessa taulukkoon samantien
• Arvot ovat aaltosulkeiden välissä ja toisistaanerotetut pilkkujen avulla
• Esimerkkejä:
int[] yksikot = {147, 323, 89, 933, 540, 269, 97, 114, 298, 476};
char[] arvosanat = {‘1', ‘2', ‘3', ‘4', ’5'};
© Jukka Juslin 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 senmukaan kuinka monta arvoa alustuslistassa on
• Alustuslistaa voidaan käyttää vain taulukonluonnin yhteydessä
© Jukka Juslin 19
Taulukot parametrinä• Koko taulukko voidaan välittää parametrina
metodille
• Kuten mikä tahansa muun olion kanssa, osoitintaulukkoon (eli olioon) välitetään metodille
• Kun taulukkoa muutetaan metodin sisällä myösalkuperä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 tyypintulee vastata metodin vastaanottamaa tyyppiä(formal ja actual parameters)
© Jukka Juslin 20
Missä ollaan?Taulukoiden luonti ja käyttö
Oliotaulukko
Vaihtelevan mittaiset parametrilistat
Kaksiulotteiset taulukotArrayList luokka
© Jukka Juslin 21
Oliotaulukot• Taulukon elementit voivat olla olioviitteitä
• Seuraava lause varaa tilaa viidelle viittaukselleString 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äytyyinstantioida omassa paikassaan (new avainsanayms.)
© Jukka Juslin 22
Oliotaulukko• sanat taulukko alkuarvoisessa tilanteessa:
sanat -
-
-
-
-
• Tässä kohdassa seuraava referenssi heittäisiNullPointerException:in:
System.out.println (sanat[0]);
© Jukka Juslin 23
Oliotaulukot• Sen jälkeen kun muutamia String olioita on luotu
ja talletettu taulukkoon:
“hauskuus”sanat
-
-
“luonti”
“nopeus”
© Jukka Juslin 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 oliollakäyttäen merkkijonoliteraaleja
String[] verbit = {“leiki", “työskentele", “syö", “nuku"};
© Jukka Juslin 25
Oliotaulukot• Seuraavaksi katsomme esimerkkijä, joka ylläpitää
joukkoa CD olioita
© Jukka Juslin 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() : voidCD
- nimi : String- artisti : String- hinta : double- kappaleMäärä : int
+ toString() : String
*
1
© Jukka Juslin 27
Komentorivi argumentit• main metodin formaali määritelmä vihjaa, että että
ko. Metodi ottaa String olioita parametrinä
• Nämä arvot tulevat komentorivi argumenteistajotka annetaan ohjelmalle kun ohjelma ajetaan
• Esimerkiksi seuraava kääntäjän kutsuminenvälittää kaksi String oliota mainille:
> java ese uskomaton kiva
• Nämä stringit talletetaan indeksien 0-1 paikallemain metodin Stringitaulukkoon
© Jukka Juslin 28
Missä ollaan?Taulukkojen luonti ja käyttö
Oliotaulukot
EXTRA: Vaihtelevanmittaisetparametrilistat
Kaksiulotteiset taulukotArrayList luokka
© Jukka Juslin 29
Vaihtelevan mittaiset parametrilistat
• Olettaen, että haluisimme tehdä metodin, jokakäsittelee vaihtelevan mittaisen määränparametrejä 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 kolmestakeskiarvo2 = keskiarvo(3, 5, 1);
© Jukka Juslin 30
Vaihtelevan mittaiset parametrilistat
• Voisimme ns. ylikuormittaa keskiarvo metodin
Huono puoli: tarvitsisimme erikseen eri version metodistajokaiselle parametrilistalle
• Voisimme määrittää metodin, joka ottaa vastaaninteger taulukon
Huono puoli: meidän täytyisi luoda taulukko ja tallettaamuuttujat ennenkuin metodia kutsutaan kullakin kerralla
• Tämä sijasta, Java JDK 1.5:sta lähtien tarjoaamukavan tavan luoda muuttuvan pituisiaparametrilistoja
© Jukka Juslin 31
Vaihtelevan pituiset parametrilistat• Käyttäen tiettyä syntaksia
formaalissaparametrilistassa, voimme määritellämetodin ottamaan vastaan minkä tahansa määränparametrejä jotka ovat samantyyppisiä
• Jokaisella kutsulla, parametrit automaattisestilaitetaan taulukkoon, jotta pystytään helpostiprosessoimaan parametrit metodissa
public double keskiarvo(int ... lista){
// toiminnot} elementin
tyyppitaulukon
nimi
Ilmoittaa että vaiht. pit. lista kyseessä
© Jukka Juslin 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. Esimerkiksiseuraava toimii hyvin!
public class Häkki {
public static void main(String ... argsi) {System.out.println(argsi[0]);System.out.println("ict02d ok");
}}
© Jukka Juslin 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 34
Vaihtelevan mittaiset parametrilistat
• Parametrin tyyppi voi olla mikä tahansaprimitiivinen tai oma oliotyyppi
public void tulosta arvosanat (Arvosana ... arvosanat)
{for (Arvosana numero : arvosanat)
System.out.println(numero);}
© Jukka Juslin 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, yhdenString olion, ja vaihtelevan mittaisen määrän doubletyypisiä arvoja numerot nimiseen taulukkoon
public void testi (int laskuri, String nimi,double ... numerot)
{// toiminnot
}
© Jukka Juslin 36
Muuttuvan pituiset parametrilistat• Muuttuvanpituinen parametrilista pitää olla esim.
Metodin määrittelyssä viimeisenä (formaalissamäärittelyssä)
• Yksi metodi ei voi ottaa vastaan kahta muuttuvanpituista parametrilistaa
• Konstruktorit voidaan myös asettaa niin, että neottavat parametrinä vaihtelevan pituisiaparametrilistoja
© Jukka Juslin 37
Missä ollaan?Taulukkojen luonti ja käyttö
Oliotaulukot
Vaihtelevan mittaiset parametrilistat
Kaksiulotteiset taulukotArrayList luokka
© Jukka Juslin 38
Kaksiulotteiset taulukot• yksiulotteinen taulukko tallettaa listan elementtejä
• kaksiulotteinen taulukko voidaan ajatella taulukkonaelementtejä, niin kuin Excel ohjelmassa: taulukolla on rivit jasarakkeet (rivit ja kolumnit)
yksiulottuvuus
kaksiulottuvuutta
© Jukka Juslin 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ä kahtaindeksiarvoa:
arvosana = pisteet[3][2];
• Taulukkoon, joka määritellään yhdellä rivillävoidaan viitata yhdellä indeksinumerolla
© Jukka Juslin 40
Kaksiulotteinen taulukko
integerinttaulukko[5][12]
Integer taulukkoint[]taulukko[5]
2D taulukko integereitäint[][]taulukko
KuvausTyyppiLause
© Jukka Juslin 41
Moniulotteiset taulukot• Taulukolla voi olla monta ulotteisuutta – jos sillä on enemmän
kuin yksi ulottuvuus, sitä kutsutaan moniulotteiseksitaulukoksi
• Jokainen uluttuvuus muodostaa jokaisen arvon alle halutunkokoisen määrän arvoja. Esim. arvosanat[3][2] jossa indeksikolmonen viittaisi opiskelijaan Matti ja numero kaksi siihenettä 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 42
Moniulotteiset taulukot• Seuraavassa kolmiulotteinen (vrt. rahan
laskeminen taulukoissa, taloushallinto)
osastot
lähiesimiehetbudjetit
© Jukka Juslin 43
Missä ollaan?Taulukkojen luonti ja käyttö
Oliotaulukot
Vaihtelevan pituiset parametrilistat
Kaksiulotteiset taulukotArrayList luokka
© Jukka Juslin 44
ArrayList luokka• ArrayList luokka on osa java.util pakettia
• Kuten taulukko, se voi tallettaa listan arvoja javiitata kuhunkin käyttäen numeerista indeksiä
• Kuitenkin, et voi käyttää hakasulje merkintääArrayList olion kanssa
• Lisäksi, ArrayList olio kasvaa ja kutistuutarpeiden mukaan, säätäen kokoaan tilanteenvaatimuksia vastaavaksi
© Jukka Juslin 45
ArrayList luokka• Elementtejä voidaan lisätä tai poistaa yhden
metodin kutsulla
• Kun elementti lisätään, muut elementit “liikkuvatsyrjään” tehdäkseen tilaa
• Yhtälailla, kun elementti poistetaan, lista “supistuukasaan” sulkeakseen tyhjän kohdan
• Elementtien indeksit muuttuvat vastaavasti niinettä esim. tyhjä kohta häviää
© Jukka Juslin 46
ArrayList luokka• An ArrayList tallettaa viittauksia Object
luokkaan, jolloin mahdollista on tallettaa minkätahansalaisia olioita
• Voimme myös määritellä ArrayList olionhyväksymään vain tietyn tyyppisiä olioita
• Seuraava rivi luo ArrayList olion, joka tallettaavain Suku tyyppisiä olioitaArrayList<Suku> tapaaminen = new ArrayList<Suku>
© Jukka Juslin 47
ArrayListin tehokkuus• ArrayList luokka on toteutettu käyttäen
allaolevaa taulukkoa
• Taulukkoa manipuloidaan niin, että indeksitsäilyvät jatkuvina kun elementtejä lisätään tai poistetaan
• Jos elementtejä lisätään ja poistetaan listanlopusta, prosessointi on suhteellisen tehokasta
• Kun elementtejä lisätään listan alkuun tai keskellelistaa jäljelläolevia elementtejä on siirrettävä
© Jukka Juslin 48
Yhteenveto• Olemme keskittyneet:
Taulukon luonti ja käyttöRajojen tarkistus ja tilavuusTaulukot olioreferenssien tallentajina (OID)Vaihtelevan pituiset parametrilistatMoniulotteiset taulukotArrayList luokka