Taulukot Taulukon määrittely ja käyttö Taulukko metodin parametrina Taulukon sisällön kopiointi toiseen taulukkoon Taulukon lajittelu esimerkki 2-ulottoisesta taulukosta 1
Mikä on taulukko? Taulukko on kokoelma samantyyppisiä muuttujia, joille on annettu yhteinen muuttujanimi Taulukko mahdollistaa usean muuttujan käsittelyn samalla tavalla Esim. Korttipakan 52 korttia voitaisiin toteuttaa taulukon avulla 2
Mitä taulukosta tulee tietää? Kuinka monta muuttujaa taulukkoon on tarkoitus laittaa eli tulevan taulukon koko Jokaista muuttujaa kutsutaan taulukon alkioksi Selvitetään taulukon alkioiden (muuttujien) yhteinen tietotyyppi Annetaan taulukolle kuvaava nimi 3
Taulukoiden ulottuvuus: Yksiulotteinen taulukko: Kaksiulotteinen taulukko: n-ulotteinen taulukko 4
Yksiulotteisen taulukon määrittely kun tiedetään taulukon alkioiden lukumäärä, mutta ei alkioiden arvoja tietotyyppi [] taulukon_nimi = new tietotyyppi [ alkiolkm ] tai tietotyyppi [] taulukon_nimi = null; taulukon_nimi = new tietotyyppi [ alkiolkm ]; Esim. int [] taulu = new int [4]; taulu: 0 1 2 3 5
Yksiulotteisen taulukon määrittely kun tiedetään taulukon alkioiden arvot tietotyyppi[] taulukon_nimi = {alkuarvo 0, arvoarvo 1,, alkuarvo n }; Esim. int [ ] taulu = { 7, 5, 9, 8 }; 0 1 2 3 taulu: 7 5 9 8 6
Taulukon koko: taulu.length Taulukon alkioon viittaaminen: taulu [ indeksi ], missä indeksi voi saada arvon 0, 1, 2, tai taulu.length-1. Jos indeksi arvo ylittää/alittaa sallitut rajat, tapahtuu taulukon yli/alivuoto ja ohjelman toiminta lakkaa. 7
Esim. int [ ] taulu = new int [5]; taulu [0] = 4; for ( int i = 1; i < taulu.length; i++) { } taulu [ i ] = taulu [ i-1 ] +3; taulu: 4 7 10 13 16 8
Esim. Mitähän ohjelma tulostaa? public class TulostaKuutJaPaivat { public void aja() { String[] kuut = { "Tammi", "Helmi", "Maalis", "Huhti", "Touko", "Kesä", "Heinä", "Elo", "Syys", "Loka", "Marras", "Joulu" }; int[] paivat = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int i; } for (i = 0; i < kuut.length; i++) System.out.println(kuut[i] + "kuussa on " + paivat[i] + " päivää"); }// end of aja 9
Harjoitus Tee ohjelma, KymmenenVuotta.java, joka lukee 10 vuosilukua, ja tulostaa vuosista aikaisimman. Vihje! Talleta luvut taulukkoon. Sijoita muuttujaan pienin taulukon ensimmäinen vuosi. Käy läpi taulukon alkiot ja tutki, onko käsiteltävä vuosi pienempi kuin muuttujan pienin arvo. Jos on, sijoita ko. vuosi muuttujaan pienin. 10
Taulukko metodin parametrina kun taulukko on metodin parametrina, sen alkioiden arvoja voidaan muuttaa metodissa, mikäli taulukko-olio on jo luotu esim. // pyytää käyttäjältä parametrina annettuun taulukkoon alkioiden arvot private void pyydaluvut (int [] taulukko){ } int i; Scanner input = new Scanner(System.in); if (taulukko!= null) { } ks. PositiivisetLuvut.java for (i=0;i<taulukko.length; i++) { } System.out.print("Anna kokonaisluku: "); taulukko [i] = input.nextint(); 11
Taulukon kopioiminen toiseen taulukkoon Taulukko kopioidaan toiseen taulukkoon alkio kerrallaan. Esim. int [] taulu1 = {1,2,3,4,5,6,7,8,9}; int [] taulu2 = new int[9]; for (int i=0;i<taulu1.length && i < taulu2.length; i++) taulu2[i] = taulu1[i]; Mitä tapahtuu? taulu1 = taulu2; 12
Metodi palauttaa taulukon Metodi voi palauttaa arvonaan viittauksen taulukkoon // luo parametrina annetun kokoisen (int koko) taulukon ja // palauttaa sen arvonaan private int [] luotaulu( int koko) { } int [] taulukko =null; if (koko > 0) taulukko = new int [koko]; return taulukko; luotaulu -metodin kutsu: int [] taulu = luotaulu( 10 ); Ks. Luvut.java 13
Harjoitus Lisää ohjelmaan KymmenenVuotta.java toiminta, jossa pyydetään käyttäjältä vuosien lukumäärä (min 3 max 10) sekä suurimman vuoden etsiminen ja tulostaminen. Vihje 1! Tee metodi int [] pyydavuosienlkm(), joka pyytää käyttäjältä vuosien lukumäärän, luo käyttäjän antaman lukumäärän kokoisen taulukon ja palauttaa sen arvonaan. Vihje 2! Tee metodi int etssuurinvuosi (int [] vuodet), joka etsii taulukosta vuodet suurimman arvon ja palauttaa sen arvonaan. 14
Esim. String-luokan metodi: String [] split ( String mjono) Metodi palauttaa taulukon siten, että taulukon alkioissa on ainoastaan merkkijonot, joiden välissä on ollut parametrin mjono kirjaimet String mjono="boo:and:foo"; String [] taulu = mjono.split(":"); for (int i=0;i<taulu.length;i++) System.out.print(taulu[i]+" "); tulostuu: boo and foo System.out.println(); 15
Metodi palauttaa taulukon jatkuu String mjono="boo:and:foo"; taulu=mjono.split("g"); for (int i=0;i<taulu.length;i++) System.out.print(taulu[i]+" "); System.out.println(); tulostuu: boo:and:foo String mjono = " tämä on lause."; taulu = mjono.split(" "); for (int i=0;i<taulu.length;i++) if (taulu[i].length()!= 0) System.out.print(taulu[i]+" "); System.out.println(); tulostuu: tämä on lause. 16
Harjoitus Tee ohjelma NimiOhjelma, joka pyytää käyttäjältä henkilön nimiä (etunimi toinen nimi ja sukunimi) neljä (4) kpl. Ohjelma muokkaa jokaisen nimen, siten, että jokainen sana alkaa suurella alkukirjaimella. Nimet talletetaan taulukkoon. Käytä metodeja! Esim. ohjelman toiminnasta: Anna henkilön nimi: seija mirjami lahtinen Anna henkilön nimi: harri antero HOLKERI Anna henkilön nimi: IRmeli Anna henkilön nimi: vilho ARMas lahtinen Tulostaa: Seija Mirjami Lahtinen Harri Antero Holkeri Irmeli Vilho Armas Lahtinen 17
Taulukon lajittelu, kuplalajittelu int [] taulu = {8, 7, 1, 5, 4}; taulu: 8 7 1 4 5 Lajitellaan taulu suuruusjärjestykseen kuplalajittelua käyttäen 18
Kuplalajittelu: Verrataan taulukon kahden ensimmäisen alkion arvoja keskenään: taulu: 8 7 9 4 5 Mikäli alkioiden arvot eivät ole järjestyksessä, vaihdetaan niiden arvot keskenään: taulu: 7 8 9 4 5 19
Kuplalajittelu: Verrataan kahden seuraavan alkion arvoja keskenään: taulu: 7 8 9 4 5 Kun arvot on järjestyksessä ei tehdä mitään: taulu: 7 8 9 4 5 20
Kuplalajittelu: Verrataan kahden seuraavan alkion arvoja keskenään: taulu: 7 8 9 4 5 Mikäli alkioiden arvot eivät ole järjestyksessä, vaihdetaan niiden arvot keskenään: taulu: 7 8 4 9 5 21
Kuplalajittelu: Verrataan kahden viimeisen alkion arvoja keskenään: taulu: 7 8 4 9 5 Mikäli alkioiden arvot eivät ole järjestyksessä, vaihdetaan niiden arvot keskenään: taulu: 7 8 4 5 9 HUOM! Taulukon suurin arvo on nyt taulukon viimeisessä alkiossa 22
Kuplalajittelu Toistetaan edellinen, mutta viimeinen verrattava alkion on taulukon toiseksi viimeinen alkio 2. kierros: 1) 3) 2) taulu: 7 8 4 5 9 taulu: 7 8 4 5 9 taulu: 7 4 8 5 9 Lopputulos: vaihto taulu: 7 4 5 8 9 vaihto HUOM! Taulukon kahdessa viimeisessä alkiossa ovat suurimmat arvot 23
Kuplalajittelu: 3. kierros: Verrataan taulukon alusta kolmanneksi viimeiseen alkioon 1) taulu: 7 4 5 8 9 2) vaihto taulu: 4 7 5 8 9 Lopputulos: taulu: 4 5 7 8 9 vaihto HUOM! Taulukon kolmessa viimeisessä alkiossa ovat taulukon suurimmat arvot järjestyksessä. 24
Kuplalajittelu 4. Kierros: Verrataan taulukon alusta neljänneksi viimeiseen alkioon 1) taulu: 4 5 7 8 9 Vaihtoa ei tule Kierros ei sisältänyt yhtään vaihtoa lajittelu ON VALMIS Ks. Kuplalajittelu.java HUOM! Kun kierros ei sisällä yhtään vaihtoa, lajittelu on valmis. 25
Harjoitus: Lisää NimiOhjelma ohjelmaan nimien lajittelu ja tulostus lajitellussa järjestyksessä. Vihje! Tee metodi private void lajittele (String [] nimet), joka lajittelee taulukon nimet. Käytä String-luokan metodia int compareto (String mjono) kahden nimen vertaamiseen. Metodi palauttaa <0, kun viestin saanut merkkijono on aakkosissa ennen parametria, ==0, kun merkkijonot ovat samat ja >0, kun viestin saanut merkkijono on aakkosissa parametrin jälkeen. 26
Kaksiulotteinen taulukko Kaksiulotteinen taulukko on matriisi, siinä on sarakkeet ja rivit Esim. 1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 Taulukon määrittely: int [ ] [ ] taulu = new int [10][10]; 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100 Ks. KaksiulotteinenTaulukko.java 27