Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

Samankaltaiset tiedostot
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Standardi- ja tietorakenneluokkia

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Ohjelmoinnin jatkokurssi, kurssikoe

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Listarakenne (ArrayList-luokka)

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Mikä yhteyssuhde on?

Metodien tekeminen Javalla

Olio-ohjelmointi Javalla

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet

20. Javan omat luokat 20.1

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

16. Javan omat luokat 16.1

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

1 Tehtävän kuvaus ja analysointi

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

private TreeMap<String, Opiskelija> nimella; private TreeMap<String, Opiskelija> numerolla;

Ohjelmointi 2 / 2010 Välikoe / 26.3

Java kahdessa tunnissa. Jyry Suvilehto

Rajapinta (interface)

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Tietokannat II -kurssin harjoitustyö

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

17. Javan omat luokat 17.1

15. Ohjelmoinnin tekniikkaa 15.1

Java-kielen perusteet

7. Näytölle tulostaminen 7.1

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Sisältö. 22. Taulukot. Yleistä. Yleistä

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

Ohjelmistojen mallintaminen viikon 4 laskareiden mallivastauksia

Tietorakenteet, laskuharjoitus 7,

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

YHTEYSSUHDE (assosiation)

Sisältö. 2. Taulukot. Yleistä. Yleistä

Luokat ja oliot. Ville Sundberg

18. Abstraktit tietotyypit 18.1

public static void main (String [] args)

15. Ohjelmoinnin tekniikkaa 15.1

14. Poikkeukset 14.1

8. Näppäimistöltä lukeminen 8.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Ohjelmointi 2 / 2011 Välikoe / 25.3

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op

Taulukot. Jukka Harju, Jukka Juslin

Taulukot. Taulukon käsittely. Tämän osan sisältö. Esimerkki. Taulukon esittely ja luonti. Taulukon alustaminen. Taulukon koko

Javan perusteita. Janne Käki

Java-kielen perusteet

Yksikkötestaus. Kattava testaus. Moduulitestaus. Ohjelman testaus. yksikkotestaus/ Seija Lahtinen

9. Periytyminen Javassa 9.1

KOHDELUOKAN MÄÄRITTELY

14. Poikkeukset 14.1

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

1. Kun käyttäjä antaa nollan, niin ei tulosteta enää tuloa 2. Hyväksy käyttäjältä luku vain joltain tietyltä väliltä (esim tai )

Taulukoiden käsittely Javalla

1. Omat operaatiot 1.1

17. Javan omat luokat 17.1

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

Periytyminen (inheritance)

Metodien tekeminen Javalla

Osio2: Taulukot Jukka Juslin

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Lista luokan sisällä

TIETORAKENTEET JA ALGORITMIT

Ohjelmoinnin perusteet, kurssikoe

Ohjelmistotekniikan menetelmät, koe

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

9. Periytyminen Javassa 9.1

Java-kielen perusteita

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Olioiden yhteistoiminta

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Oliot viestivät metodeja kutsuen

Luokan sisällä on lista

Ohjelmointi 2, välikoe

Interaktiivinen tarinankerronta

8. Näppäimistöltä lukeminen 8.1

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmointityö 3. Mikko Laamanen

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

12. Monimuotoisuus 12.1

HSMT Tietokannoista. Ville Leppänen. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.1/32

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

11. Javan valintarakenteet 11.1

4. Luokan testaus ja käyttö olion kautta 4.1

1. Mitä tehdään ensiksi?

4. Olio-ohjelmoinista lyhyesti 4.1

Ohjelmistojen mallintaminen, syksy 2011, laskuharjoitus 2

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Aalto Yliopisto T Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa

Pakkauksen kokoaminen

Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2

Transkriptio:

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Tietorakenneluokkia 2: HashMap, TreeMap

Tietorakenneluokkia ja -rajapintoja Java tarjoaa laajan kokoelman tietorakennerajapintoja ja - luokkia. Aiemmin tutustuttiin ArrayList-luokkaan. Collection-rajapinnan toteuttajat ovat tietorakenteita olioille. Map-rajapinnan toteuttajat ovat tietorakenteita avain- /arvopareille. Vesa Ollikainen & Outi Grotenfelt 2

Assosiatiivinen taulukko Assosiatiivisella taulukolla (hajautustaululla) tarkoitetaan tietorakennetta, jossa tieto koostuu avain-arvopareista tieto haetaan avaimen arvon perusteella Tieto voidaan hakea nopeasti avaimen arvon perusteella. avaimen arvosta lasketaan ns. hajautusarvo, jonka perusteella tieto löytyy oikeasta muistipaikasta nopeasti. vrt. tavallinen (indeksoitu) taulukko, jossa tieto löytyy nopeasti indeksin arvon perusteella. Vesa Ollikainen & Outi Grotenfelt 3

Esimerkki Esimerkissä on tallennettu puhelinliittymien liittymänumerot ja liittymien saldot. avaimena liittymänumero arvona saldo Vesa Ollikainen & Outi Grotenfelt 4

Määrittely ja alustus Java-kielessä Map <avaimen_tyyppi, arvon_tyyppi> rakenteen_nimi = new HashMap <avaimen_tyyppi, arvon_tyyppi>(); Java-kielessä on HashMap-luokka, joka toteuttaa hajautustaulurakenteen. Alkiot tallennetaan satunnaisessa järjestyksessä. HashMap-luokka toteuttaa Map-rajapinnan, joka on tarkoitettu avain-arvoparien tallentamiseen. Versiosta JDK 5.0 alkaen Java-kielessä oleva geneerisyys vaatii määrittämään avainten ja arvojen tyypit luontivaiheessa. Luotavaa HashMap-oliota suositellaan käsiteltäväksi Maprajapinnan ilmentymänä. Toteuttava luokka voidaan tällöin vaihtaa helposti. Vesa Ollikainen & Outi Grotenfelt 5

Map-rajapinnan metodeja arvon_tyyppi get(object avain) palauttaa avainta vastaavan arvo-olion. boolean containskey(object avain) palauttaa tiedon, esiintyykö avain avainten joukossa boolean containsvalue(object arvo) palauttaa tiedon, esiintyykö arvo arvojen joukossa. arvon_tyyppi remove(object avain) poistaa avaimen määräämän avain-arvoparin. void clear() tyhjentää hajautustaulukon. Vesa Ollikainen & Outi Grotenfelt 6

Map-rakenteen iterointi for (Map.Entry<avaimen_tyyppi, arvon_tyyppi> alkion_nimi : rakenteen_nimi.entryset()) { // Iterointi onnistuu for/each-rakenteella (yllä). Map-rajapinnan metodi entryset() palauttaa Setrajapinnan edustajan, jonka alkiot ovat Map.Entryrajapinnan mukaisia avain-arvo pareja. Set-rajapinta on iteroitavissa for/each-rakenteella. Map.Entry-rajapinta määrittelee metodit avaimen_tyyppi getkey() palauttaa avaimen arvon_tyyppi getvalue() palauttaa arvon Vesa Ollikainen & Outi Grotenfelt 7

import java.util.*; public class Puhelinliittymat { public static void main(string[] args) { Map<String, Double> liittymat = new HashMap<String, Double>(); Esimerkki liittymat.put("040-1234567", 102.40); // autoboxing double -> Double liittymat.put("041-8800262", 17.15); liittymat.put("043-4837263", 0.00); liittymat.put("044-3472897", 219.36); System.out.println(liittymat.get("041-8800262")); System.out.println(liittymat.get("020-1001001")); for (Map.Entry<String, Double> liittyma: liittymat.entryset()){ System.out.println("Liittymän "+liittyma.getkey()+" saldo on "+ liittyma.getvalue()); run: 17.15 null Liittymän 044-3472897 saldo on 219.36 Liittymän 043-4837263 saldo on 0.0 Liittymän 040-1234567 saldo on 102.4 Liittymän 041-8800262 saldo on 17.15 BUILD SUCCESSFUL (total time: 1 second) Esimerkissä tallennetaan neljän puhelinliittymän saldotiedot, haetaan kaksi arvoa avaimen perusteella ja iteroidaan avaimet ja arvot. Huomaa toistuva autoboxing/autounboxing -ominaisuuden soveltaminen. muunnos alkeistietotyypistä kääreluokan edustajaksi ja toisin päin. Vesa Ollikainen & Outi Grotenfelt 8

TreeMap TreeMap-tietorakenne tallentaa alkiot avainarvojen mukaisessa järjestyksessä. Rakenne on käytännössä hitaampi kuin HashMap. Jos hajautusraketta käsitellään Map-rajapinnan edustajana, voidaan HashMap vaihtaa TreeMaprakenteeksi (ja kääntäen) muuttamalla luotavan rakenteen todellinen tyyppi yhdessä lauseessa: Vesa Ollikainen & Outi Grotenfelt 9

import java.util.*; public class Puhelinliittymat { Iteratorrajapinta public static void main(string[] args) {. Iterator<Map.Entry<String, Double>> i=liittymat.entryset().iterator(); while (i.hasnext()){ Map.Entry<String, Double> liittyma = i.next(); System.out.println("Liittymän "+liittyma.getkey()+" saldo on "+ liittyma.getvalue()); Edellä todettiin, että Set-rajapinta on iteroitavissa. For/each-rakenne on yksinkertaisempi ratkaisu iterointiin. Set-rajapinta toteuttaa myös Collection-rajapinnan vaatiman iterator()-metodin, joka palauttaa Iteratoriterointirajapinnan edustajan. Iterator-rajapinta sisältää mm. metodit: boolean hasnext() alkion_tyyppi next() Täsmälleen sama tulostus kuin sivulla 8 Vesa Ollikainen & Outi Grotenfelt 10

Esimerkki Luodaan videovuokraamolle tietorakenne, jossa videovuokraamossa pidetään kirjaa elokuvista niiden tallenteista Videovuokraamo tuntee tallenteensa. Tallennetaan ne HashMap-rakenteeseen. Saavutetaan nopea haku tallennenumeron perusteella. Vesa Ollikainen & Outi Grotenfelt 11

Esimerkki: Luokka Leffa public class Leffa { private String nimi; private int hinta; public Leffa(String nimi, int hinta){ this.nimi = nimi; this.hinta = hinta; public String tostring(){ return nimi + " " + hinta; Vesa Ollikainen & Outi Grotenfelt 12

Esimerkki: Luokka Tallenne public class Tallenne { private int tallennekoodi; private Leffa elokuva; public Tallenne(int tallennekoodi, Leffa elokuva){ this.tallennekoodi = tallennekoodi; this.elokuva = elokuva; public String tostring(){ return tallennekoodi + " " + elokuva.tostring(); Vesa Ollikainen & Outi Grotenfelt 13

import java.util.*; public class Videovuokraamo { private Leffa movie1, movie2; private Map<Integer, Tallenne> dvdt = new HashMap<Integer, Tallenne>(); private void rekisteroi(leffa movie, int lkm, int ekakoodi){ for (int i=ekakoodi; i<ekakoodi+lkm; i++){ Tallenne dvd = new Tallenne(i, movie); dvdt.put(new Integer(i), dvd); private void operoi(){ movie1 = new Leffa("James Bond 5", 2); movie2 = new Leffa("Transformers", 5); rekisteroi(movie1, 2, 12648); rekisteroi(movie2, 1, 1836); rekisteroi(movie2, 4, 13000); // hae tallenne 12648 System.out.print(dvdt.get(12648)); Esimerkki: Luokka Videovuokraamo run: 12648 James Bond 5 213002 Transformers 5 1836 Transformers 5 13003 Transformers 5 13000 Transformers 5 13001 Transformers 5 12649 James Bond 5 2 12648 James Bond 5 2BUILD SUCCESSFUL (total time: 1 second) // hae kaikki tallenteet for (Map.Entry<Integer, Tallenne>dvd : dvdt.entryset()){ System.out.println(dvd.getValue()); public static void main(string[] args){ Videovuokraamo munmaku = new Videovuokraamo(); munmaku.operoi(); Vesa Ollikainen & Outi Grotenfelt 14

Uutta ja vanhaa Javaa Ennen JDK 5.0 -versiota tietorakenneluokkien käsittely oli hankalampaa: Ei geneerisyyttä. Rakenteisiin voitiin tallentaa mitä tahansa olioita. Tyypinmuunnoksista oli huolehdittava itse. Ei automaattista käärimistä alkeistyypeille ja takaisin (autoboxing/autounboxing). Ei for/each-rakennetta. Luotava Iterator-rajapinnan ilmentymä. Kalvosarjan tekijän nimi 15

THANK YOU! www.metropolia.fi/en/ www.facebook.com/metropoliaamk outi.grotenfelt@metropolia.fi