Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes) Kääreluokista Javan alkeistietotyypit ja vastaavat kääreluokat Autoboxing Integer-luokka Double-luokka
Kääreluokista Alkeistietotyyppiset muuttujat (esimerkiksi int, double jne.) eivät ole luokkia eikä niistä luoda olioita On kuitenkin tilanteita, jolloin tällainen käsittely on tarpeen, esimerkiksi kun halutaan tallentaa alkeistyyppisiä tietoja listarakenteeseen (käsitellään seuraavaksi), jonka sisältämien tietojen tulee olla viittausmuuttujia Tätä varten Javassa on alkeistyyppisiä muuttujia vastaavat luokat, joita kutsutaan kääreluokiksi (wrapper classes) Kääreluokat sisältävät myös hyödyllisiä metodeja edustamiensa tietotyyppien käsittelyyn 2 29.3.2012
Javan alkeistietotyypit ja vastaavat kääreluokat Alkeistietotyyppi int double char boolean short long byte float Kääreluokka Integer Double Character Boolean Short Long Byte Float 3
Autoboxing Javassa on JDK 1.5:n myötä olemassa ns. autoboxing-ominaisuus, joka tarvittaessa muuntaa automaattisesti alkeistietotyyppisen muuttujan kääreluokan olioksi ja päinvastoin: Integer lukuolio = 232; int luku = lukuolio; Double lukuolio2 = 112.3; double luku2 = lukuolio2; 4
Integer-luokan metodeita: (1) public int intvalue() palauttaa olion arvon alkeistietotyypin kokonaislukuna public double doublevalue() palauttaa olion arvon alkeistietotyypin desimaalilukuna public String tostring() palauttaa olion arvon merkkijonona public static int parseint(string mjono) tulkitsee parametrina tulleesta merkkijonosta kokonaisluvun public boolean equals(integer luku) Integer-olion tietosisällön vertailu toiseen Integer-olioon 5
Double-luokan metodeita: (2) public double doublevalue() palauttaa olion arvon alkeistietotyypin desimaalilukuna public int intvalue() palauttaa olion arvon alkeistietotyypin kokonaislukuna (desimaalit katkaistaan) public String tostring() palauttaa olion arvon merkkijonona public static double parsedouble(string mjono) tulkitsee parametrina tulleesta merkkijonosta kokonaisluvun public boolean equals(double luku) tietosisällön vertailu toisen Double-olion kanssa 6
Tuntitehtävä 1: WrapperKokeilu Käydään läpi viikon tuntitehtävistä tehtävä 1, ks. tuntitehtävät. 7
Listarakenne (oppikirjan luku 10.10) (ArrayList-luokka) Listarakenteesta Javan ArrayList Listan luonti ArrayList-luokan metodit Listan läpikäynti Indeksin perusteella Iteraattorin avulla
Listarakenteesta Lista on taulukon kaltainen rakenne, mutta sen kokoa ei tarvitse määrätä ennalta (siksi sanotaan, että taulukko on staattinen ja lista on dynaaminen) Listan alkioihin viitataan järjestysnumerolla samaan tapaan kuin taulukon alkioihin Listaan voidaan lisätä mihin väliin tahansa alkioita ja lista pitää järjestysnumerot ajan tasalla Listasta voidaan poistaa mistä välistä tahansa alkioita ja lista pitää järjestysnumerot ajan tasalla 9
Javan ArrayList Javassa listarakenteen eräs toteutus on luokka ArrayList Listaan voidaan lisätä oliotyyppisiä muuttujia (viittausmuuttujia), ei siis alkeistietotyyppisiä muuttujia (tarvittaessa käytetään kääreluokkia) Lista voidaan tyypittää, jolloin listaan voidaan laittaa vain samantyyppisiä olioita (tällä jaksolla käytämme tyypitettyjä listoja) Listan indeksointi alkaa nollasta, kuten taulukollakin 10
Listan luonti Lista luodaan sen mukaan, minkä tyyppisiin olioihin (E) se viittaa ArrayList <E> listannimi = new ArrayList<E>(); Esim. lista, joka viittaa Integer-olioihin ArrayList <Integer> lista = new ArrayList <Integer>(); Esim. lista, joka viittaa Double-olioihin ArrayList <Double> dlista = new ArrayList <Double>(); Esim. lista, joka viittaa Tuote-olioihin ArrayList <Tuote> tuotelista = new ArrayList<Tuote>(); 11
Esim. lista ArrayList <Integer> lista = new ArrayList <Integer>(); for (int i=1;i<5;i++) lista.add(i); Tunnussolmu lista 1 2 3 4 12
ArrayList-luokan metodeita: public int size() palauttaa listan koon eli listan alkioiden lukumäärän public E get(int i) Palauttaa listan alkiosta i viittaavan olion public boolean add( E olio) lisää alkion listan loppuun public void add(int i, E olio) Lisää alkion listan kohtaan i, aikaisemmin kohdassa i ollut alkio siirtyy kohtaan i+1, jne. public E set(int i, E olio) Korvaa alkiosta i viittaavan olion parametrin oliolla public boolean isempty() kertoo onko lista tyhjä 13
ArrayList-luokan metodeita jatkuu public void clear() Tyhjentää listan public int indexof (E olio) etsii listasta parametrissa välitettyä oliota ja palauttaa sen paikan/indeksin public E remove (int index) Poistaa listan solmun kohdassa index, palauttaa arvonaan olion, johon poistettu solmu viittasi 14
Tuntitehtävä 2: EkaLista Käydään läpi viikon tuntitehtävistä tehtävä 2, ks. tuntitehtävät. 15
Listan läpikäynti Listarakenne tarvitsee usein käydä läpi alkio kerrallaan, esimerkiksi, kun Listan sisältö halutaan tulostaa muotoillusti Listasta halutaan etsiä tiettyä alkiota Lista halutaan järjestää Läpikäyntiin on kaksi tapaa: indekseihin perustuva ja iteraattorin avulla tehtävä 16
Listan läpikäynti indeksin avulla Indekseihin perustuva läpikäynti vastaa taulukon läpikäyntiä Esimerkiksi lista voidaan käydä läpi alusta loppuun ja tulostaa alkiot seuraavasti: for (int i = 0; i < lista.size(); i++ ) System.out.println(lista.get(i)); 17
Tuntitehtävä 3: Käydään läpi viikon tuntitehtävistä tehtävä 3, ks. tuntitehtävät. 18
Listan läpikäynti iteraattorin avulla Lista voidaan käydä läpi myös iteraattorin avulla Javassa on myös rakenteita, joiden alkioita ei indeksoida juoksevalla numerolla. Tällaiset rakenteet, kuten HashMap (ei käsitellä tällä opintojaksolla) on käytävä läpi iteraattorin avulla Läpikäynti iteraattorin avulla tehdään käyttämällä luokkaa Iterator seuraavalla sivulla olevan esimerkin tapaan (huomaa myös seuraavan alkion haku listasta iteraattorin avulla) 19
Iterator-luokan metodeita public boolean hasnext() Onko iteraattorin viittaama alkio listan viimeinen? public E next () Siirtää iteraattorin viittaamaan seuraavaa alkiota ja palauttaa ko. alkion viittaaman olion public void remove () Poistaa iteraattorin viittaaman alkion ArrayList-luokalla on käytettävissä metodi: public Iterator <E> iterator () Metodi palauttaa iteraattorin siten, että tämä viittaa listan tunnussolmuun 20
Iterator-esimerkki String mjono; ArrayList <String> lista = new ArrayList<String>(); lista.add("nolla"); lista.add("yksi"); lista.add("kaksi"); Iterator <String> it = lista.iterator(); while (it.hasnext() == true) { mjono= it.next(); } System.out.println(mjono); 21
Tuntitehtävä 4: EkaLista2 Tehdään viikon tuntitehtävistä tehtävä 4, ks. tuntitehtävät. 22
Haku ja lajittelu listarakenteen tapauksessa (vrt. viikko 6 taulukoista haku ja taulukoiden lajittelu) Haku ArrayList-rakenteesta ArrayList-listan alkioiden lajittelu Lajittelu Javan valmiilla välineillä
Haku ArrayList-rakenteesta Listasta tai vastaavasta rakenteesta (kuten aiemmin taulukoista) on usein tarpeen hakea tietoa tai tiettyä alkiota Suoraviivainen haku (peräkkäishaku) tapahtuu käymällä rakenne läpi alkio kerrallaan ja vertailemalla jokaista alkiota tai alkion sisältämää tietoa etsittävään Lisäksi täytyy päättää, mitä tehdään jos haettava löytyy ja mitä tehdään, jos haettavaa ei löydy Lajitelluista rakenteista voidaan hakea muillakin tavoilla (esim. binäärihaku), mutta niitä ei käsitellä tällä jaksolla 24
Tuntitehtävä 5: HakuListasta Käydään läpi viikon tuntitehtävistä tehtävä 5, ks. tuntitehtävät. 25
ArrayList-listan alkioiden lajittelu Kuten aiemmin taulukotkin, myös lista tai muu vastaava rakenne on myös usein tarpeen lajitella alkioiden tai alkioiden sisältämän tiedon mukaiseen kasvavaan tai laskevaan järjestykseen Lajittelun voi toteuttaa itse (esim. omana metodinaan, kuten taulukoiden tapauksessa on aiemmin tehty) tai käyttää järjestämiseen Javan valmiita välineitä Javan valmiit välineet mahdollistavat lajittelun esimerkiksi alkeistyyppisiä tai String-tyyppisiä tietoja sisältäville taulukoille ja listoille 26
Tuntitehtävä 6: ListanLajittelu Käydään läpi viikon tuntitehtävistä tehtävä 6, ks. tuntitehtävät. 27
Lajittelu Javan valmiilla välineillä Taulukko voidaan järjestää kasvavaan järjestykseen Javan luokan Arrays tarjoamalla metodilla: static void sort ( E [] taulu) Vastaavasti listan voi järjestää kasvavaan järjestykseen luokan Collections metodin avulla: static void sort ( ArrayList <E> lista) Listan alkioiden järjestyksen voi tarvittaessa myös kääntää luokan Collections metodin avulla: static void reverse (ArrayList <E< lista) 28
Tuntitehtävä 7: ListanJarjestaminen2 Käydään läpi viikon tuntitehtävistä tehtävä 7, ks. tuntitehtävät. Mietitään myös, milloin kannattaa käyttää omaa järjestämismetodia ja milloin Javan valmiita välineitä? Miksi? 29