1 / 53

Java-ohjelmointi opas ammattimaiseen osaamiseen Luku 11 Taulukot ja perustietorakenteet

? 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

misha
Download Presentation

Java-ohjelmointi opas ammattimaiseen osaamiseen Luku 11 Taulukot ja perustietorakenteet

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


    1. © Jukka Harju, Jukka Juslin Java-ohjelmointi opas ammattimaiseen osaamiseen Luku 11 Taulukot 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

More Related