530 likes | 1.13k Views
? Jukka Harju, Jukka Juslin. N?m? kalvot on lisensoitu Creative Commons Attribution-ShareAlike 1.0 -lisenssill?. Lis?ys edelliseen lisenssiin: Kalvojen muokkaaminen on sallittu vain opettajille, joiden kursseilla k?ytet??n kurssikirjana Tuloksellinen Java-ohjelmointi ? tai Java ohjelmointi opas
E N D
1. © Jukka Harju, Jukka Juslin Java-ohjelmointiopas ammattimaiseen osaamiseenLuku 11Taulukot ja perustietorakenteet
2. © Jukka Harju, Jukka Juslin Nämä kalvot on lisensoitu Creative Commons Attribution-ShareAlike 1.0 -lisenssillä. Lisäys edelliseen lisenssiin: Kalvojen muokkaaminen on sallittu vain opettajille, joiden kursseilla käytetään kurssikirjana Tuloksellinen Java-ohjelmointi – tai Java ohjelmointi opas ammattimaiseen osaamiseen -kirjaa.
3. © Jukka Harju, Jukka Juslin Missä ollaan?
4. © Jukka Harju, Jukka Juslin Taulukot ovat olioita, jotka auttavat organisoimaan suuria määriä tietoa.
Käsittelylistalla on:
Taulukon tekeminen ja käyttö
Rajojen tarkastus ja kapasiteetti
Taulukot, jotka tallettavat olioviittauksia
Vaihtuvamittaiset parametrilistat Taulukko
5. © Jukka Harju, Jukka Juslin Taulukko Taulukko on järjestetty lista arvoja
6. © Jukka Harju, Jukka Juslin Tiettyyn arvoon taulukossa viitataan käyttämällä taulukon nimeä, jota seuraa indeksin numero hakasulkeissa.
Esimerkiksi:
pisteet[2]
viittaa arvoon 94 (kolmas arvo taulukossa).
Indeksi viittaa soluun, johon tallennetaan esimerkin taulukossa yksi int-tyyppinen arvo
Taulukko
7. © Jukka Harju, Jukka Juslin Taulukon soluun voidaan tallentaa arvo, solun sisältö voidaan tulostaa tai solua voidaan käyttää laskutoimituksessa.
pisteet[2] = 89;
pisteet[eka] = pisteet[eka] + 2;
keskiarvo = (pisteet[0] + pisteet[1])/2;
System.out.println ("Huippu = " + pisteet[5]); Taulukko
8. © Jukka Harju, Jukka Juslin Taulukon kaikkien solujen tietotyyppi on sama.
Solun tyyppi voi olla primitiivityyppi tai viittausmuuttuja.
Taulukko voidaan luoda sisältämään esimerkiksi int-tyyppistä tietoa, merkkejä, merkkijonoja (viittauksia String -luokan olioihin), viittauksia Kolikko–luokan olioihin yms.
Javassa taulukko itse on olio. Taulukko
9. © Jukka Harju, Jukka Juslin Missä ollaan?
10. © Jukka Harju, Jukka Juslin Taulukon luominen pisteet-taulukko voidaan luoda seuraavasti:
int[] pisteet = new int[10];
Muuttujan pisteet tyyppi on int[] (solun tyyppi on int, []-merkit kertovat kyseessä olevan taulukon).
Huomaa, että taulukon tyyppi ei määrää taulukon kokoa, vaan jokaiselle taulukko-oliolle annetaan oma koko.
Viittausmuuttuja pisteet asetetaan osoittamaan uuteen taulukko-olioon, joka pystyy säilyttämään 10 int-tyyppistä tietoa.
11. © Jukka Harju, Jukka Juslin Muutamia muita esimerkkejä taulukon luonnista.
float[] hinnat = new float[500];
boolean[] vivut;
vivut = new boolean[20];
char[] merkit = new char[1750]; Taulukon luominen
12. © Jukka Harju, Jukka Juslin Missä ollaan?
13. © Jukka Harju, Jukka Juslin Taulukon käyttö Java SE 5:n Iterator-luokka helpottaa taulukon elementtien läpikäyntiä:
14. © Jukka Harju, Jukka Juslin Taulukon rajojen tarkistaminen Kun taulukko on luotu, sillä on kiinnitetty koko, jota ei voida enää muuttaa.
Indeksin, jolla viitataan taulukon soluun, täytyy olla taulukon rajojen sisällä.
Toisin sanoen indeksin arvon pitää olla >= 0 ja <N (taulukon koko).
Java kääntäjä heittää ArrayIndexOutOfBoundsException-luokan poikkeuksen, jos indeksi on taulukon rajojen ulkopuolella.
Tätä kutsutaan automaattiseksi rajojen tarkistamiseksi.
15. © Jukka Harju, Jukka Juslin Esimerkiksi taulukon merkit koko on 100, mutta indeksi laskuri saa liikkua vain välillä 0-99.
Jos laskurin arvo on 100, silloin seuraava viittaus aiheuttaa poikkeuksen heittämisen:
System.out.println(merkit[laskuri]);
On tyypillistä tehdä ns. off-by-one virheitä taulukkoja käytettäessä. Taulukon rajojen tarkistaminen
16. © Jukka Harju, Jukka Juslin Jokaisella taulukko-oliolla on julkinen vakioattribuutti nimeltään length, joka sisältää taulukon koon.
Tähän viitataan taulukon nimen kautta käyttäen length-attribuuttia, ei esim. getLength-metodia:
int pituus = pisteet.length;
Huomaa, että length sisältää solujen lukumäärän eikä suurinta sallittua indeksinumeroa. Taulukon rajojen tarkistaminen
17. © Jukka Harju, Jukka Juslin Toinen taulukon luontitapa Hakasulkeet taulukon tyypissä voidaan kirjoittaa taulukon tietotyypin tai nimen jälkeen.
Seuraavat kaksi lausetta ovat merkitykseltään identtiset:
float[] hinnat;
float hinnat[];
Ensimmäinen tapa on helpommin luettava ja suositeltava.
18. © Jukka Harju, Jukka Juslin Alustuslistat Alustuslistaa voidaan käyttää arvojen sijoittamisessa taulukkoon sen luontivaiheessa.
Arvot kirjoitetaan aaltosulkeisiin pilkulla erotettuina.
Esimerkkejä:
19. © Jukka Harju, Jukka Juslin Huomaa, että kun käytetään alustuslistaa:
Ei käytetä new-operaattoria
Taulukon kokoa ei määritellä
Taulukon koko määrittyy automaattisesti sen mukaan kuinka monta arvoa alustuslistassa on.
Alustuslistaa voidaan käyttää vain taulukon luonnin yhteydessä. Alustuslistat
20. © Jukka Harju, Jukka Juslin Taulukko parametrina Koko taulukko voidaan välittää parametrina metodille.
Kuten mikä tahansa muun olion kanssa, viittaus taulukkoon (eli olioon) välitetään metodille.
Kun taulukkoa muutetaan metodin sisällä näkyvät muutokset myös kutsuneeseen metodiin. Taulukkoa ei siis ole tarpeen palauttaa metodista.
Myös yksittäinen taulukon solu voidaan välittää metodille, kunhan solun tyyppi vastaa metodin parametrimuuttujan tyyppiä.
21. © Jukka Harju, Jukka Juslin Missä ollaan?
22. © Jukka Harju, Jukka Juslin Oliotaulukko Taulukon elementit voivat olla viittausmuuttujia.
Seuraava lause varaa tilaa viidelle viittausmuuttujalle, jotka viittaavat String-luokan olioihin:
String[] sanat = new String[5];
Yo lause ei luo String–olioita.
Taulukko sisältää null–alkuarvoja.
Olio, joka tallennetaan taulukkoon täytyy erikseen luoda.
23. © Jukka Harju, Jukka Juslin sanat-taulukko alkuarvoisessa tilanteessa: Oliotaulukko
24. © Jukka Harju, Jukka Juslin Sen jälkeen kun muutamia String-olioita on luotu ja tallennettu taulukkoon: Oliotaulukko
25. © Jukka Harju, Jukka Juslin Komentoriviargumentit main-metodin määrittelystä havaitaan, että metodi saa parametrina String-tyyppisen taulukon.
Taulukon arvot ovat peräisin komentoriviargumenteista, jotka annetaan ohjelmalle käynnistyksen yhteydessä.
Esimerkiksi seuraava komento välittää kaksi String -oliota main-metodille:
> java ohjelma uskomaton kiva
Nämä merkkijonot tallennetaan indeksien 0 ja 1 kohtiin main-metodin parametritaulukkoon.
26. © Jukka Harju, Jukka Juslin Missä ollaan?
27. © Jukka Harju, Jukka Juslin Wrapper-luokat Wrapper-luokkia käytetään ”kietomaan” alkeistyyppinen tieto olion sisään (attribuutin arvoksi).
Tämä on tarpeen koska taulukkoa kehittyneemmät Javan tietorakenteet hyväksyvät arvoikseen vain olioita.
Java SE 5 toi uutena ns. ”autoboxing”-ominaisuuden, jolla Wrapper-luokkien käyttö on erittäin helppoa.
Jokaiselle primitiivityypille löytyy oma Wrapper-luokkansa (ks. kirjan taulukko 9.1).
28. © Jukka Harju, Jukka Juslin Wrapper-luokat Seuraavassa esimerkki Wrapper-luokan käytöstä autoboxingilla.
Katso myös kirjan esimerkki 9.5.
29. © Jukka Harju, Jukka Juslin Wrapper-luokat
30. © Jukka Harju, Jukka Juslin Wrapper-luokat Ilman autoboxingia sama toiminta vaatisi seuraavan koodin.
31. © Jukka Harju, Jukka Juslin Wrapper-luokat
32. © Jukka Harju, Jukka Juslin Missä ollaan?
33. © Jukka Harju, Jukka Juslin Linkitetyt listat Linkitetty lista on dynaaminen tietorakenne.
Dynaamisen tietorakenteen kokoa voidaan muuntaa myös luonnin jälkeen (vrt. taulukko).
Linkitetty lista on järjestetty joukko solmuja, joista jokainen sisältää tiedon lisäksi linkin seuraavaan solmuun.
34. © Jukka Harju, Jukka Juslin Linkitetyt listat Tieto on viittausmuuttuja, eli viittaa olioon.
35. © Jukka Harju, Jukka Juslin Linkitetyt listat Linkitetystä listasta voidaan poistaa solmu, muuttamalla poistettavaan solmuun osoittavaa linkkiä ja poistettava solmun linkkiä.
36. © Jukka Harju, Jukka Juslin Linkitetyt listat Linkitettyyn listaan voidaan lisätä solmu lisäämällä solmu sekä tarvittava linkki.
37. © Jukka Harju, Jukka Juslin Missä ollaan?
38. © Jukka Harju, Jukka Juslin ArrayList –luokka Luokka ArrayList sijaitsee pakkauksessa java.util.
ArrayList on linkitetyn listan eräs toteutus.
Periytyy luokasta AbstractList.
Voidaan määritellä hyväksymään minkä tahansa tyyppisiä viittausmuuttujia, ei kuitenkaan primitiivityyppisiä muuttujia.
39. © Jukka Harju, Jukka Juslin ArrayList –luokka Tyypittämättömän listan luonti:
ArrayList lista = new ArrayList();
Tyypittämätön lista hyväksyy mitä tahansa tyyppiä olevat viittausmuuttujat.
Tyypitetty lista hyväksyy vain listan tyypin mukaisia viittausmuuttujia, virheellisistä sijoitusyrityksistä saadaan ilmoitus jo kääntäjältä.
Tyypitetyn listan luonti:
ArrayList<String> lista = new ArrayList<String>();
40. © Jukka Harju, Jukka Juslin ArrayList –luokka Tärkeimpiä metodeja:
add (ylikuormitettu) lisää elementin listaan
clear tyhjentää listan
contains tutkii löytyykö etsittävä elementti listasta
get palauttaa elementin halutusta positiosta
isEmpty tutkii onko lista tyhjä
remove (ylikuormitettu) poistaa elementin halutusta positiosta tai halutun elementin
size palauttaa listan elementtien lukumäärän
41. © Jukka Harju, Jukka Juslin Iterator-rajapinta Iteraattori on olio, jonka avulla voidaan läpikäydä kokoelma (esim. ArrayList-olio).
Iteraattorille on käytettävissä metodit:
hasNext palauttaa arvon true, mikäli kokoelmassa on vielä elementtejä jäljellä
next palauttaa kokoelman seuraavan elementin
remove poistaa viimeksi palautetun elementin kokoelmasta
ArrayList-luokan oliolle saadaan luotua iteraattori seuraavasti:
ArrayList lista = new ArrayList();
Iterator iter = lista.iterator();
ArrayList-luokan iterator-metodi on peritty yliluokalta AbstractList.
42. © Jukka Harju, Jukka Juslin ArrayList & Iterator käyttöesimerkki Seuraava esimerkkiohjelma käyttää ArrayList- ja Iterator-luokkia.
Katso myös kirjan esimerkki 9.6.
43. © Jukka Harju, Jukka Juslin
44. © Jukka Harju, Jukka Juslin
45. © Jukka Harju, Jukka Juslin
46. © Jukka Harju, Jukka Juslin
47. © Jukka Harju, Jukka Juslin Missä ollaan?
48. © Jukka Harju, Jukka Juslin HashMap –luokka Luokka HashMap sijaitsee pakkauksessa java.util.
HashMap on hajautettu tietorakenne, johon voidaan viedä avain-arvo -pareja.
HashMapista pystytään hakemaan tehokkaasti avainta vastaava arvo.
Voidaan määritellä hyväksymään minkä tahansa tyyppisiä viittausmuuttujia, ei kuitenkaan primitiivityyppisiä muuttujia.
49. © Jukka Harju, Jukka Juslin HashMap –luokka Tyypittämättömän HashMapin luonti:
HashMap tiedot = new HashMap();
Tyypittämätön HashMap hyväksyy mitä tahansa tyyppiä olevat viittausmuuttujat.
Tyypitetty HashMap hyväksyy vain HashMapin tyypin mukaisia viittausmuuttujia, virheellisistä sijoitusyrityksistä saadaan ilmoitus jo kääntäjältä.
Tyypitetyn HashMapin luonti:
HashMap<String, String> tiedot = new HashMap<String, String>();
50. © Jukka Harju, Jukka Juslin HashMap –luokka Tärkeimpiä metodeja:
clear tyhjentää HashMapin
containsKey tutkii löytyykö etsittävä avain HashMapista.
containsValue tutkii löytyykö etsittävä arvo HashMapista
get palauttaa haettavaa avainta vastaavan arvon
isEmpty tutkii onko HashMap tyhjä
put vie HashMapiin annetun avainmen ja arvon
remove poistaa annetun avaimen mukaisen avain-arvo –parin HashMapista
size palauttaa HashMapin avain-arvo -parien lukumäärän
51. © Jukka Harju, Jukka Juslin HashMapin käyttöesimerkki Seuraava esimerkkiohjelma käyttää HashMap-luokkaa.
Katso myös kirjan esimerkki 9.8.
52. © Jukka Harju, Jukka Juslin HashMapin käyttöesimerkki
53. © Jukka Harju, Jukka Juslin HashMapin käyttöesimerkki