22. Taulukot.

Slides:



Advertisements
Samankaltaiset esitykset
6. Metodit.
Advertisements

© Jukka Harju, Viittausmuuttujat. © Jukka Harju, Viittaukset •Viittausmuuttuja sisältää tiedon siitä missä muistipaikassa olio.
16. Javan omat luokat.
Tuloksellinen Java-ohjelmointi Luku 9 Taulukot ja perustietorakenteet
Taulukot Jukka Juslin © Jukka Juslin 2006.
Taulukot: Array Taulukko Javassa pitää aina perustaa (new)
Taulukoiden määrittely, käsittely ja kopiointi Vaihtoehdot taulukoille
22. Taulukot.
Rakenteinen ohjelmointi
Ohjelmointitaito (ict1td002, 12 op) Syksy 2008
Näytölle tulostaminen. 7.2 Sisällys System.out.println - ja System.out.print -operaatiot. Tulostus erikoismerkeillä. Edistyneempää tulosteiden.
C-ohjelmointi, kevät 2006 Taulukot Binääritiedostot Luento
Java-ohjelmointi Opas ammattimaiseen osaamiseen Luku 4 Toistolauseet
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
16. Lohkot Sisällys Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat.
© Jukka Harju, Jukka Juslin Java-ohjelmointi Opas ammattimaiseen osaamiseen Luku 9 Poikkeuskäsittely.
Poikkeustenkäsittely  Mitä poikkeustenkäsittely tarkoittaa?  Poikkeuksen käsitteleminen  Poikkeusluokkien hierarkia  Poikkeuksen heittäminen 1.
Toiston tekeminen Javalla  Mikä toistorakenne on?  while toistorakenne  do-while toistorakenne  for toistorakenne 1.
Ohjelmoinnin tekniikkaa Sisällys for -lause lyhemmin. Vaihtoehtoisia merkintöjä aritmeettisille lauseille. Useiden muuttujien esittely.
TAULUKKO YKSIULOTTEINEN TAULUKKO. TAULUKKO  Taulukon tarkoitus Ohjelmassa tarvitaan paljon samantyyppisiä samaan kohdealueeseen kuuluvia muuttujia Näitä.
13. Hyvä ohjelmointitapa (osa 1)
1 Kertaus koetta varten oleellisista asioista Jukka Juslin.
7. Oliot ja viitteet.
Map-luokka Mikä Map on? Mapin esittely ja luonti Map-luokan metodeja Mappiin lisääminen Mapin läpikäynti Mapista poistaminen 1.
String-vertailusta ja Scannerin käytöstä (1/2)
Metodit – Arvotyyppi Ellei metodi palauta arvoa, sen arvotyyppi on void Tällöin ”return;”-lauseke ei ole metodissa pakollinen, vaikka sen käyttö on sallittua.
11. Javan toistorakenteet
19. Olio-ohjelmointia Javalla
20. Javan omat luokat.
Kuinka niitä käsitellään
4. Attribuutit 4.1. Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2.
5. Kapselointi Yleistä Kapseloinnilla (encapsulation) tarkoitetaan luokan tietojen ja toimintojen pakkaamista yhdeksi suojatuksi kokonaisuudeksi.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Näppäimistöltä lukeminen Sisällys Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä. In -luokka.
Hyvä ohjelmointitapa (osa 2) Yleistä Lisää hyviä ohjelmointikäytäntöjä: − Jaa pitkä koodi osiin. − Käytä attribuutteja säästeliäästi.
Poikkeukset Yleistä Virheeseen varautuminen tarkoittaa sitä, että ohjelmoija huomioi koodia kirjoittaessaan ajonaikaisen virheen mahdollisuuden.
Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen
Olioiden taulukointi Perustaulukon käyttö Luokan ilmentymät voidaan tallettaa taulukkoon samoin kuin muuttujat Esimerkki talletetaan taulukkoon opintojaksojen.
1 © Jukka Juslin Luokat, attribuutit ja metodit Yleistietoa: seuraavalla koulutusviikolla tarkempi käsittely.
14. Poikkeukset Sisällys Johdanto poikkeuksiin. Poikkeusten käsittely: − Poikkeusten käsittely paikallisesti. − Poikkeusten heittäminen. Exception.
15. Ohjelmoinnin tekniikkaa
Tiedostot. 8.2 Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen.
Olio-ohjelmoinista lyhyesti. 2.2 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen.
3. Olio-ohjelmoinista lyhyesti
6. Tiedostot.
1. Omat operaatiot.
7. Oliot ja viitteet.
2. Taulukot.
14. Poikkeukset.
Kuinka niitä käsitellään
4. Komentoriviparametrit
7. Hyvä ohjelmointitapa..
3. Luokat, oliot ja metodit Java-kielessä (Lausekielinen ohjelmointi I ja II –kursseilla opitun kertausta.)
15. Lohkot.
7. Näytölle tulostaminen
16. Ohjelmoinnin tekniikkaa
14. Hyvä ohjelmointitapa.
2. Taulukot.
15. Lohkot.
6. Metodit.
7. Oliot ja viitteet.
3. Komentoriviparametrit
4. Attribuutit.
7. Hyvä ohjelmointitapa..
14. Poikkeukset.
7. Näytölle tulostaminen
3. Attribuutit.
14. Poikkeukset.
4. Luokan testaus ja käyttö olion kautta
16. Ohjelmoinnin tekniikkaa
Esityksen transkriptio:

22. Taulukot

Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona.

Yleistä Joskus on tarpeen koota useita samantyyppisiä muuttujia yhdeksi kokonaisuudeksi. Esim. Tuotetaan satunnaislukuja tietyltä väliltä. Kuinka säilyttää vaikkapa 1000 int-tyyppistä satunnaislukua tietokoneen keskusmuistissa? Esittely int luku1, luku2, … , luku1000; onnistuu toki, mutta ei kovin käytännöllistä varsinkin, mikäli seuraavaksi halutaan tallentaa muistiin 2000 satunnaislukua!

Yleistä Tarvitaan tietorakenne (data structure), joka mahdollistaa tietojen tallentamisen keskusmuistiin ja lukemisen keskusmuistista. Tietorakenteita on paljon ja ohjelmointiongelma ratkaisee pitkälti mitkä ovat sopivia tai parhaita. Tarkemmin Tietorakenteet-kurssilla.

Yleistä Nyt käsitellään vain taulukko (array). Taulukko on samantyyppisten alkioiden (element) kokoelma, jossa alkioilla on järjestys. Alkiot indeksoidaan 0, ... , n - 1, missä n on alkioiden lukumäärä (vertaa merkkijono). Esim. int-tyyppiset luvut 12, 56, 34 ja 78 sisältävä yksiulotteinen taulukko: Indeksi 1 2 3 Alkio 12 56 34 87

Esittely ja luominen Esitellään hakasulkuja ([ ]) käyttäen. Yleisesti: tyyppi[ ] taulukonNimi; Taulukko on viitetyyppinen muuttuja. Pelkkä esittely ei riitä - muistia täytyy varata new-operaatiolla kuten muillekin olioille. Luomisen yhteydessä määritellään myös taulukon koko (alkioiden lukumäärä). Yleisesti: taulukonNimi = new tyyppi[koko]; Taulukon alkiot alustuvat automaattisesti.

Esittely ja luominen int[] satunnaisluvut; satunnaisluvut = new int[4]; 1) Java varaa esittelyn yhteydessä muistia viitteelle ja alustaa viitteen null-arvolla. satunnaisluvut null 2) Lauseke new int[4]; luo taulukko-olion, alustaa alkiot ja palauttaa olioon liittyvän tunnuksettoman viitteen. 3) Sijoituksen seurauksena satunnaisluvut-viite liittyy samaan olioon kuin paluuarvona saatu viite. satunnaisluvut

Esittely ja luominen Taulukko voidaan alustaa luonnin yhteydessä, jolloin koko määräytyy automaattisesti. Yleisesti: taulukonNimi = new tyyppi[] { arvo1, … , arvoN }; Esim. // Esitellään taulukko. int[] satunnaisluvut; // Luodaan 4 alkion kokoinen taulukko. satunnaisluvut = new int[4]; Esim. int[] satunnaisluvut; satunnaisluvut = new int[] { 12, 56, 34, 87 };

Esittely ja luominen Taulukon esittely, luominen ja mahdollinen alustus voidaan yhdistää samaan lauseeseen. Esim. int[] satunnaisluvut = new int[4]; int[] satunnaisluvut = new int[] { 12, 56, 34, 87 }; // Esittely, luominen ja alustus lyhemmin. int[] satunnaisluvut = { 12, 56, 34, 87 }; Taulukon kokoa ei voi muuttaa jälkeenpäin. Kullakin taulukolla on julkinen length attribuutti, joka ilmoittaa taulukon koon. Hyödyllinen erityisesti, kun taulukko saadaan parametrina.

Alkioiden käsittely Hakasulkeilla ([ ]) taulukosta voidaan myös “erottaa” tiettyyn alkioon liittyvä muuttuja, jonka avulla alkion arvo voidaan lukea tai muuttaa. Alkion arvon lukeminen yleisesti: taulukonNimi[indeksiarvo] Alkion arvon muuttaminen yleisesti: taulukonNimi[indeksiarvo] = arvo; Indeksiarvo on int-tyyppinen literaali, muuttuja, vakio tai lauseke.

Alkioiden käsittely Indeksointi alkaa nollasta, jolloin 0 ≤ indeksiarvo < taulukon koko. Virheellinen indeksin arvo aiheuttaa ajonaikaisen virheen ArrayIndexOutOfBoundsException. Erityisesti taulukon ylärajan kanssa on syytä olla tarkkana: n alkion kokoisen taulukon viimeinen paikka on n - 1. for-silmukka on erityisen kätevä, kun on tarpeen käydä läpi kaikki taulukon indeksiarvot.

Esimerkki: arvon lukeminen Esim. System.out.println(satunnaisluvut[3]); // 87 Esim. int l = satunnaisluvut[4] + 1; // Ohjelma kaatuu Indeksi 1 2 3 Alkio 12 56 34 87

Esimerkki: arvon muuttaminen Esim. satunnaisluvut[0] = 6; Esim. System.out.println(satunnaisluvut[0]); // 6 X Indeksi 1 2 3 Alkio 12 56 34 87 Indeksi 1 2 3 Alkio 6 56 34 87

Esimerkki: käsittelyä silmukoilla /* Taulukon käsittelyä silmukoilla: täytetään taulukko satunnaisluvulla * ja tulostetaan luvut näytölle. */ public class TaulukonKasittelya { public static void main(String[] args) { // Taulukon koko ja sen suurin luku vakioina. final int KOKO = 100; final int MAX = 10; // Taulukon esittely ja luominen. int[] satunnaisluvut = new int[KOKO]; // Täytetään taulukko satunnaisluvuilla väliltä [0, MAX]. for (int i = 0; i < KOKO; i++) satunnaisluvut[i] = (int)((MAX + 1) * Math.random()); // Tulostetaan taulukon alkiot. for (int j = 0; j < KOKO; j++) System.out.print(satunnaisluvut[j] + " "); }

Esimerkki: haku taulukosta /* Taulukon käsittelyä silmukoilla: * täytetään taulukko satunnaisluvulla ja haetaan * käyttäjän antamaa lukua taulukosta. */ public class SatunnainenTaulukko1D { public static void main(String[] args) { // Taulukon suurin luku. final int MAX = 100; // Taulukon esittely ja luominen. int[] satunnaisluvut = new int[10]; // Täytetään satunnaisluvuilla väliltä [0, MAX]. for (int i = 0; i < satunnaisluvut.length; i++) { satunnaisluvut[i] = (int)((MAX + 1) * Math.random()); System.out.print(satunnaisluvut[i] + " "); } // Luetaan haettava luku. System.out.println("\nAnna haettava luku:"); int luku = In.readInt(); // Haetaan. boolean hukassa = true; int j = 0; while (j < satunnaisluvut.length && hukassa) { if (satunnaisluvut[j] == luku) hukassa = false; j++; } if (!hukassa) System.out.print("Löytyi!"); else System.out.print("Ei löytynyt!");

Kaksi ulottuvuutta Taulukossa voi olla useampia ulottuvuuksia. Kahden ulottuvuuden esittämiseen tarvitaan kaksi indeksiä: toinen ulottuvuus (j) ensimmäinen ulottuvuus (i) i j 1 2 3 23 44 5 33 32 11 12 56 34 87

Kaksi ulottuvuutta Esittely yleisesti: tyyppi[][] nimi; Esim. // Esitellään taulukko. int[][] satunnaisluvut; Luominen yleisesti: taulukonNimi = new tyyppi[rivejä][sarakkeita]; Esim. // Luodaan 12 alkion kokoinen taulukko. satunnaisluvut = new int[3][4]; Esittely ja luominen samassa lauseessa: tyyppi[][] taulukonNimi = new tyyppi[rivejä][sarakkeita]; Esim. // Esitellään ja luodaan 12 alkion kokoinen taulukko. int[][] satunnaisluvut = new int[3][4];

Kaksi ulottuvuutta Alustaminen luomisen yhteydessä: tyyppi[][] taulukonNimi = { rivi1, … , riviN } missä rivi = { arvo1, … , arvoM } (myös tyyppi[][] taulukonNimi = new tyyppi[][] { rivi1, … , riviN } Edellä N rivien lukumäärä ja M sarakkeiden lukumäärä. Esim. int[][] satunnaisluvut = { { 23, 44, 5, 33 }, { 3, 32, 0, 11 }, { 12, 56, 34, 87 } };

Kaksi ulottuvuutta Taulukon arvoon viittaaminen yleisesti: taulukonNimi[rivi][sarake] Esim. System.out.println(satunnaisluvut[0][0]); // 23 System.out.println(satunnaisluvut[1][2]); // 0 System.out.println(satunnaisluvut[2][3]); // 87 1 2 3 23 44 5 33 32 11 12 56 34 87

Kaksi ulottuvuutta length-attribuutti ilmoittaa rivien lukumäärän. Sarakkeiden lukumäärä saadaan selville tutkimalla jonkin rivin pituus.

Esimerkki: käsittelyä silmukoilla /* Taulukon käsittelyä silmukoilla: täytetään taulukko satunnaisluvulla * ja tulostetaan luvut näytölle. */ public class SatunnainenTaulukko2D { public static void main(String[] args) { // Taulukon suurin luku. final int MAX = 100; // Taulukon esittely ja luominen. int[][] satunnaisluvut = new int[3][4]; // Täytetään taulukko satunnaisluvuilla väliltä [0, MAX]. for (int rivi = 0; rivi < satunnaisluvut.length; rivi++) for (int sarake = 0; sarake < satunnaisluvut[0].length; sarake++) satunnaisluvut[rivi][sarake] = (int)((MAX + 1) * Math.random()); // Tulostetaan taulukon alkiot. for (int rivi = 0; rivi < satunnaisluvut.length; rivi++) { System.out.print(satunnaisluvut[rivi][sarake] + "\t"); System.out.println(); }

Taulukko parametrina Sekä alkeis- että viitetyyppiset parametrit ovat metodin lohkon tunnuksia: Parametrit näkyvät vain lohkossaan: luodaan metodiin tultaessa ja tuhotaan metodista poistuttaessa. Parametrin arvoon tehdyt muutokset eivät jää voimaan. Viitteen arvo on osoite, joka liittää viitteen olioon. Viitetyyppinen parametri osoittaa metodissa samaan olioon kuin metodin kutsupaikassa: Taulukon (olion) sisältöä voidaan muuttaa metodissa ja muutokset säilyvät metodista poistumisen jälkeen.

Taulukko parametrina Koska viitetyyppiselle parametrille pitää varata muistia new-operaatiolla, ja ihmisen tiedetään olevan erehtyväinen, on viitetyyppisiä parametreja sisältävissä metodeissa tarkistettava, että muistia on todella varattu. Tähän tehtävään sopii null-arvo, jonka Java antaa alkuarvoksi jokaiselle viitteelle. null-arvon voidaan ajatella olevan keskusmuistin ulkopuolella. if (viitetyyppisenParametrinTunnus != null) { … }

Taulukko parametrina Ilman if-lausetta ohjelman suoritus keskeytyy ajonaikaiseen virheeseen (NullPointer-Exception) aina kun parametrille ei ole varattu muistia. /* Täytetään taulukko t satunnaisluvuilla. */ public static void tayta(int[] t) { // Satunnaisluvut välillä [0, MAX[. final int MAX = 10; // Täytetään, jos on varattu muistia. if (t != null) { for (int i = 0; i < t.length; i++) t[i] = (int)(MAX * Math.random()); }

Taulukko parametrina /* Tulostetaan taulukko t. */ public static void tulosta(int[] t) { // Tulostetaan, jos on varattu muistia. if (t != null) { for (int i = 0; i < t.length; i++) System.out.print(t[i] + " "); System.out.println(); }

Taulukko parametrina public static void main(String[] args) { final int KOKO = 5; int[] satunnaisluvut = new int[KOKO]; // Java alustaa taulukon sisällön automaattisesti. tulosta(satunnaisluvut); // 0 0 0 0 0 // Täytetään taulukko satunnaisluvuilla. tayta(satunnaisluvut); // Metodissa taulukkoon tehdyt muutokset säilyvät. tulosta(satunnaisluvut); // 8 0 5 7 8 }

HelloWorld: main-metodi public class HelloWorld { public static void main (String[] args) { System.out.println("Hello World!"); } Parametri args on String-tyyppisten alkioiden taulukko. Nimi Parametri(t) Määreet

Taulukko paluuarvona Metodissa luotu taulukko voidaan palauttaa metodin paluuarvona. Metodista palautetaan taulukko-olioon liittyvä viite. Kutsuvassa metodissa taulukko-olioon täytyy kiinnittää uusi viite, jotta oliota voidaan käyttää. Joskus yksiulotteista taulukkoa käytetään kahden tai useamman paluuarvon palauttamiseen. Eri tyyppisten arvojen palautus hankalaa. Useampia arvoja voidaan palauttaa joustavammin luokkatyyppisen olion avulla.

Taulukko paluuarvona /* Luodaan n alkion taulukko, täytetään se satunnaisluvuilla sekä * palautetaan viite taulukko-olioon. Paluuarvo on null, jos n < 1. */ public static int[] luoJaTayta(int koko) { final int MAX = 10; // Satunnaisluvut välillä [0, MAX[. if (koko > 0) { // Koko on järkevä. int[] taulu = new int[koko]; // Luodaan olio ja liitetään siihen viite. for (int i = 0; i < taulu.length; i++) // Täytetään satunnaisluvuilla. taulu[i] = (int)(MAX * Math.random()); return taulu; // Palautetaan viite taulukko-olioon. } else // Virheellinen parametri. return null; // Palautetaan virheen merkkinä null-arvo.

Taulukko paluuarvona public static void main(String[] args) { // Taulukon alkioiden lukumäärä vakiona. final int KOKO = 5; // Luodaan taulukko, täytetään se satunnaisluvuilla // ja liitetään siihen viite, jotta taulukkoa ei hukata. int[] satunnaisluvut = luoJaTayta(KOKO); // Metodissa taulukkoon sijoitetut arvot säilyvät. tulosta(satunnaisluvut); // 5 6 2 1 4 }