Taulukot, silmukat ja muut joka koodin pikku veijarit Janne Käki 7.9.6
MERKKI liikenne jono METRI para laku MOGARI ATRI psyki buutti ESINE pelottelu ellistäminen runsauden kuono TUNTI SARVI kusi assistentti
Klassinen for-lause for (int i = ; i < ; i++) {... ei alustuslauseke onko ehto tosi? kyllä suoritettavat lauseet for-lauseen jälkeinen elämä kasvatuslauseke
Tällainen for-lause... for (int i = ; i < ; i++) {......vastaa while-lauseella toteutettua rakennetta { int i = ; while (i < ) {... i++; Mikä merkitys on ulommilla aaltosuluilla?
Iteroiva for-lause public void tulostanimet(set<olento> olennot) { for (Olento o : olennot) { System.out.println(o.annaNimi()); Käy läpi kaikki tiettyyn kokoelmaan sisältyvät oliot. Kukin kokoelman olio sijoitetaan siis vuorollaan for-lauseen määrittelemään muuttujaan ja siihen sovelletaan aaltosulkujen sisällä olevia lauseita. Läpikäyntijärjestys riippuu kokoelmasta. Listoilla se on määrätty, joukoilla (Set) yleensä määrittelemätön, mutta ei kuitenkaan aidosti satunnainen. Kokoelman sisältöä ei saa muuttaa (lisätä tai poistaa olioita) kesken iteroinnin, muuten seuraa virhe nimeltä ConcurrentModificationException.
public void tulostanimet(set<olento> olennot) { String nimet = ; for (Olento o : olennot) { nimet += o.annanimi() +, ; System.out.println(nimet); Tulostaa: Arska, Pena, Mats, Rauski, Miten pääsemme eroon ylimääräisestä pilkusta? public void tulostanimet(set<olento> olennot) { String nimet = ; int otuslaskuri = ; for (Olento o : olennot) { nimet += o.annanimi(); if (otuslaskuri < olennot.size()-) { nimet +=, ; otuslaskuri++; System.out.println(nimet);
Muuttujista Muuttujan määrittely (eli esittely): nimetään tietolokero ja kerrotaan, minkä tyyppistä tietoa se voi sisältää. String brutaalisolvaus; int vihreidenpingviinienlukumaara; Muuttujan alustus: sijoitetaan muuttujaan (sen historian ensimmäinen) arvo. brutaalisolvaus = hähä mogari ; Voidaan tehdä myös suoraan määrittelyn yhteydessä: String brutaalimpisolvaus = luetaan sitä API:a ; Muuttujan arvon lukeminen: käytetään muuttujaa missä tahansa muualla kuin sijoituslauseen vasemmalla puolella. System.out.println(brutaalimpiSolvaus); if (vihreidenpingviinienlukumaara > ) { Ei saa tehdä alustamattomalle muuttujalle, muuten kääntäjää alkaa pelottaa. ( Variable might not have been initialized. ) Attribuuteilla on aina tietty alkuarvo automaattisesti (numeromuuttujilla nolla, booleaneilla false, oliomuuttujilla null), joten niiden alustaminen ei ole välttämätöntä ennen muuttujan käyttämistä yleensä toki suositeltavaa.
Tietotyypeistä byte alkeistyypit kokonaisluku desimaaliluku (liukuluku) short int long float double totuusarvo boolean merkki char viittaustyypit merkkijono alkeistyyppien kääreet taulukot muut oliotyypit String Integer, Double, Boolean, Character,... int[ ], double[ ], Object[ ], Karttaruutu[ ][ ],... Object, Random, HashSet, Pelotteluesine,... olioita
Viittaustyyppiset muuttujat Olio on kuin ilmapallo. Oliomuuttujat ovat viittauksia kuin naruja, joiden päässä se ilmapallo on. Sama olioilmapallo voi olla useamman narun päässä. Siihen voidaan vaikuttaa (eli sen metodeita kutsua) kaikkia naruja pitkin, ja kaikki kutsut muokkaavat yhtä ja samaa oliota. Kun oliomuuttuja lakkaa olemasta tai saa uuden arvon, yksi naru katkeaa. Kun olio ei ole enää yhdenkään narun päässä kiinni, se karkaa stratosfääriin (eli Javan automaattinen roskienkerääjä tulee ja syö sen).
Taulukko Taulukkomuuttujan määrittely ja alustaminen ns. taulukon alustajalla: int[] taulu = { 9,,, 7,,, ; 9 7 5 6 Taulukon indeksointi ja sen alkioiden arvojen asettaminen: taulu[] = ; taulu[] = ; taulu[taulu.length-] = 8; 7 5 6 8 Uuden, tyhjän taulukon luonti new-operaattorilla: taulu = new int[5]; Taulukotkin ovat olioita. Huomaa, että taulukon koko on taulukko-olion, ei taulukkomuuttujan ominaisuus. (Samaan muuttujaan voi sijoittaa minkä kokoisen taulukon tahansa.) Taulukon tietotyyppi on sen sijaan myös taulukkomuuttujan ominaisuus.
Laskurilla varustettu for-silmukka on kuin luotu taulukon läpikäymiseen, esimerkiksi seuraavassa fiktiivisessä Olento-luokan metodissa: public void kauhistuhirviolaumaa(olento[] hirviot) { for (int i = ; i < hirviot.length; i++) { hirviot[i].pelottele(this); Muista, että taulukon indeksit alkavat nollasta ja päättyvät yhtä pienempään kuin taulukon koko. hirviot[i] viittaa vuorollaan aina yhteen taulukon alkioon, siis Olento-tyyppiseen olioon (ellei kyseinen alkio ole null). this viittaa aina siihen olioon, jonka metodista on kyse. Sitä voi käyttää myös sellaisenaan, esimerkiksi parametrina jollekin toiselle metodille.
Jos määrittelemme seuraavasti int[] taulua; int[] taulub = null; int[] tauluc = new int[5]; Pelotteluesine[] taulud = new Pelotteluesine[]; ja sen jälkeen yritämme seuraavia asioita, mikään niistä ei onnistu. Miksi? taulua[] = 9; taulub[] = 88; tauluc[5] = ; tauluc[] =.86; taulua = new double[]; taulub = taulua; taulud[666].annapelottavuus(); Variable taulua might not have been initialized. java.lang.nullpointerexception java.lang.arrayindexoutofboundsexception Possible loss of precision. Found: double. Required: int. Incompatible types. Found: double[ ]. Required: int[ ]. Variable taulua might not have been initialized. java.lang.nullpointerexception Inspired by: http://www.cs.helsinki.fi/u/wikla/ohjelmointi/sisalto//taulukot.html#
Kaksiulotteinen taulukko eli taulukoita taulukossa Luodaan D-taulukko eli matriisi, jossa on neljä riviä ja viisi saraketta: Olento[][] otusruudukko = new Olento[][5]; Itse asiassa loimme yhden nelipaikkaisen taulukon, jonka alkioiden tietotyyppi on Olento[]. Se sisältää siis neljä yksiulotteista, viisipaikkaista olentotaulukkoa. Nämä taulukot ovat aluksi tyhjiä, eli niiden jokainen alkio on null. Voimme sijoittaa ruudukkoon uusia arvoja kertomalla, mihin alitaulukkoon ja mihin lokeroon siellä kyseinen arvo sijoitetaan: otusruudukko[][] = new Olento( Rauski, );
D-taulukon rivien ei välttämättä tarvitse olla samanpituisia jokainen alitaulukkohan on yksilöllinen olio, jonka pituus voi olla mitä vain: Olento[][] otusruudukko = new Olento[][]; Huomaa tyhjät jälkimmäiset hakasulut. Tässä luotiin tyhjä nelipaikkainen taulukko, johon voi sijoittaa Olento[]-taulukoita. Näitä alitaulukkoja ei kuitenkaan vielä ole olemassa, ne on luotava nyt erikseen. otusruudukko[] = new Olento[5]; otusruudukko[] = new Olento[]; otusruudukko[] = new Olento[]; otusruudukko[] = new Olento[]; otusruudukko[][] = new Olento( Rauski, );
for-lauseita voi käyttää myös sisäkkäin. Kaksiulotteisen taulukon läpikäynnissä tämä on usein välttämätöntä: String[][] ruudut = new String[5][5]; for (int i = ; i < ruudut.length; i++) { for (int j = ; j < ruudut[i].length; j++) { ruudut[i][j] = i +, + j;,,,,,,,,,,,,,,,,,,,,,,,,,