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

Samankaltaiset tiedostot
18. Abstraktit tietotyypit 18.1

A TIETORAKENTEET JA ALGORITMIT

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PushFront(x): lisää tietoalkion x jonon eteen

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

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

Tieto- ja tallennusrakenteet

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

TIETORAKENTEET JA ALGORITMIT

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

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

7/20: Paketti kasassa ensimmäistä kertaa

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

2. Perustietorakenteet

Olio-ohjelmointi Javalla

20. Javan omat luokat 20.1

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

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

useampi ns. avain (tai vertailuavain) esim. opiskelijaa kuvaavassa alkiossa vaikkapa opintopistemäärä tai opiskelijanumero

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Mikä yhteyssuhde on?

Java-kielen perusteet

Listarakenne (ArrayList-luokka)

Ohjelmointi 1 Taulukot ja merkkijonot

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

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

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

Algoritmit 1. Luento 4 Ke Timo Männikkö

17. Javan omat luokat 17.1

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

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

17. Javan omat luokat 17.1

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

Ohjelmoinnin perusteet Y Python

2. Olio-ohjelmoinista lyhyesti 2.1

Java kahdessa tunnissa. Jyry Suvilehto

Olio-ohjelmointi Syntaksikokoelma

9. Periytyminen Javassa 9.1

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

Geneeriset luokat. C++ - perusteet Java-osaajille luento 6/7: Template, tyyppi-informaatio, nimiavaruudet. Geneerisen luokan käyttö.

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

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

Rakenteiset tietotyypit Moniulotteiset taulukot

Ohjelmointi 2 / 2010 Välikoe / 26.3

Algoritmit 2. Luento 2 To Timo Männikkö

16. Javan omat luokat 16.1

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Sekvenssi: kokoelma peräkkäisiä alkioita (lineaarinen

Java-kielen perusteet

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

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

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

Linkitetystä listasta perittyä omaa listaa käytetään muun muassa viestiin liittyvien vastausten säilömiseen.

Algoritmit 2. Luento 2 Ke Timo Männikkö

Algoritmit 2. Luento 7 Ti Timo Männikkö

4. Olio-ohjelmoinista lyhyesti 4.1

Taulukot. Jukka Harju, Jukka Juslin

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

Algoritmit 1. Luento 6 Ke Timo Männikkö

Rajapinta (interface)

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

15. Ohjelmoinnin tekniikkaa 15.1

Ohjelmoinnin jatkokurssi, kurssikoe

UML ja luokkien väliset suhteet

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Tietorakenteet ja algoritmit

Javan perusteita. Janne Käki

Java-kielen perusteet

Luokan sisällä on lista

Lyhyt kertaus osoittimista

TyontekijaOhjelma. +main() (käyttää) + = public - = private

Metodien tekeminen Javalla

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

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

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

Helsingin yliopisto, Tietojenkäsittelytieteen laitos Ohjelmistotuotanto, kurssikoe , H. Laine Arvostelu

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

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

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

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

Tietorakenteet, laskuharjoitus 3, ratkaisuja

7. Oliot ja viitteet 7.1

Tietorakenteet ja algoritmit

ITKP102 Ohjelmointi 1 (6 op)

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

ITKP102 Ohjelmointi 1 (6 op)

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Hakemistojen sisällöt säilötään linkitetyille listalle.

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

1. Omat operaatiot 1.1

1 Tehtävän kuvaus ja analysointi

Pakkauksen kokoaminen

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

1. Mitä tehdään ensiksi?

7. Näytölle tulostaminen 7.1

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

Transkriptio:

Sisällys 18. bstraktit tietotyypit Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.1 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja: alkeistietotyypit (esimerkiksi int ja double) ja viitetietotyypit (luokat, rajapinnat ja taulukot). bstrakti tietotyyppi (abstract data type) on tietotyypin kuvaus, jossa ei oteta kantaa tyypin toteutukseen tai edes toteutuskieleen. Ympäristö tuntee vain liittymän, jolla abstraktia tietotyyppiä käytetään. Johdanto bstrakti tietotyyppi koostuu operaatioista: tyypin liittymä ympäristöön ja tietorakenteesta: tyypin sisäinen tiedonesitystapa. Tietorakenne (data structure) voitava vaihtaa ilman, että operaatioiden otsikkoja tarvitsee muuttaa. bstraktin tietotyypin käyttäjä ei ole kiinnostunut tietorakenteesta vaan nimenomaan tietotyypin tarjoamista operaatioista. 18.3 18.4

Johdanto Esim. bstraktin tietotyypin ika käyttäjää ei niinkään kiinnosta ajan esitystapa tietotyypin sisällä, vaan se kuinka voidaan vaikkapa laskea kahden ajankohdan välinen aika. Usein abstraktin tietotyypin tietorakenne sisältää useita tietoja, jolloin yksittäistä tietoa sanotaan ksi. Johdanto bstraktin tietotyypin idea on hyvin samankaltainen kuin luokkien, mutta abstraktit tietotyypit ovat olioohjelmointia vanhempi keksintö. Olio-ohjelmointi tarjoaa mainion tavan toteuttaa abstrakteja tietotyyppejä operaatiot metodeiksi ja tietorakenne private-tyyppiseksi attribuutiksi. bstrakti tietotyyppi voidaan siis toteuttaa näppärästi kapseloituna luokkana. 18.5 18.6 Pino Pino (stack) on abstrakti tietotyyppi, jossa lisättävä menee aina pinon päälle ja poistettava otetaan aina pinon päältä. Last-In-First-Out (LIFO) periaate. Lisäykset ja poistot kerrallaan. nalogiana voi ajatella korttipakkaa pasianssissa: Pakkaan voidaan lisätä kortti vain päälle (ei pakan väliin tai pohjalle). Pakasta voidaan ottaa vain päällimmäinen kortti (ei pakan välistä tai pohjalta). Pinon operaatioita lisää(lkio a): lisää n a pinon päälle, mikäli pinoon mahtuu vielä. poista(): palauttaa ja poistaa pinon päällimmäisen n, mikäli pinossa on ita. koko(): iden lukumäärä ( 0) pinossa. onkotyhjä(): palauttaa totuusarvon true, jos pino on tyhjä ja totuusarvon false, jos pinossa ainakin yksi. ylin(): palauttaa päällimmäisen n sitä poistamatta, mikäli pinossa on ita. Tietorakenne: esimerkiksi taulukko tai linkitetty lista. 18.7 18.8

Esimerkki Esimerkki Luodaan tyhjä, maksimissaan 5 ta sisältävä pino. lisää() koko() = 1 onkotyhjä() = false lisää() koko() = 2 lisää(c) koko() = 3 lisää(d) koko() = 4 D C lisää(e) Pino täynnä: koko() = 5 E D C poista() = E koko() = 4 ylin() = D koko() = 4 D C poista() = D koko() = 3 poista() = C koko() = 2 poista() = koko() = 1 poista() = Pino tyhjä: koko() = 0 onkotyhjä() = true 18.9 18.10 Jono Jono (queue) on abstrakti tietotyyppi, jossa lisättävä menee aina jonon loppuun ja poistettava otetaan aina jonon alusta. First-In-First-Out (FIFO) periaate. Lisäykset ja poistot kerrallaan. Esim. Ruokalan jono, jossa ensiksi tullutta asiakasta palvellaan ensiksi ja uudet asiakkaat sijoittuvat kiltisti jonon loppuun. Jonon operaatioita lisää(lkio a): lisää n a jonon loppuun, mikäli jonossa on vielä tilaa. poista(): palauttaa ja poistaa ensimmäisen n jonosta, mikäli jono ei ole tyhjä. koko(): iden lukumäärä ( 0) jonossa. onkotyhjä(): palauttaa totuusarvon true, jos jono on tyhjä ja totuusarvon false, jos jonossa ainakin yksi. keula(): palauttaa jonon ensimmäisen n sitä poistamatta, mikäli jono ei ole tyhjä. Tietorakenne: esimerkiksi taulukko tai linkitetty lista. 18.11 18.12

Esimerkki Esimerkki Luodaan tyhjä, maksimissaan 5 ta sisältävä jono. lisää(), koko() = 1, onkotyhjä() = false lisää(), koko() = 2 lisää(c), koko() = 3, lisää(d), koko() = 4 C D lisää(e), Jono täynnä: koko() = 5 poista() =, koko() = 4, keula() =, koko() = 4 poista() =, koko() = 3, poista() = C, koko() = 2, poista() = D, koko() = 1 poista() = E, Jono tyhjä: koko() = 0, onkotyhjä() = true C D E C D E E 18.13 18.14 Linkitetty lista Linkitetty lista (linked list) on tietorakenne, joka koostuu toisiinsa viittaavista solmuista (node). Taulukon tan listan illa on järjestys ja ihin voidaan yleensä myös viitata nollasta alkavan indeksin avulla. Taulukosta poiketen linkitetty lista on dynaaminen tietorakenne, joka käyttää aina muistia täsmälleen tarvittavan määrän: lkioiden lisääminen ja poistaminen muuttaa listan kokoa. Yksinkertaisin muoto yhteen suuntaan linkitetty lista. Yhteen suuntaan linkitetty lista (YSLL) Solmu = tieto + viite an solmuun. public class Solmu { private Object ; private Solmu ; public Solmu(Object ) { = ; = ; }... } String sana1 = new String(); Solmu s = new Solmu(sana1); s sana1 18.15 18.16

Yhteen suuntaan linkitetty lista (YSLL) Pää (head) on listan ensimmäinen solmu. Häntä (tail) on listan viimeinen solmu. Viimeinen viite osoittaa -arvoon. Esim. Kolmisolmuinen YSLL, jonka tietot ovat merkkijonoja. Yhteen suuntaan linkitetty lista (YSLL) Operaatiot määritellään lähteestä riippuen hieman eri tavoin. Toteutukseenkin useita lähestymistapoja: Esimerkiksi käytetäänkö vartijasolmuja vai ei? Nyt pyritään mahdollisimman yksinkertaiseen ratkaisuun. 18.17 18.18 YSLL:n operaatiot YSLL:n operaatiot lisäälkuun(lkio a): Lisää listalle uuden pään, joka sisältää n a. lisääloppuun(lkio a): Lisää listalle uuden hännän, joka sisältää n a. lisää(int indeksi, lkio a): Lisää annettuun listan kohtaan uuden solmun, joka sisältää n a. poistalusta(): Poistaa listan pään ja palauttaa pään n. poistalopusta(): Poistaa listan hännän ja palauttaa hännän n. poista(int indeksi): Poistaa solmun annetusta kohdasta ja palauttaa poistetun solmun n. (int indeksi): Palauttaa annetussa kohdassa olevan solmun n. korvaa(int indeksi, lkio a) Korvaa annetussa kohdassa olevan solmun tieton annetulla lla a. koko(): Palauttaa listan solmujen lukumäärän. onkotyhjä(): Palauttaa totuusarvon true, mikäli listassa ei ole solmuja, ja totuusarvon false, mikäli listassa on yksi tai useampi solmu. 18.19 18.20

Listan alkuun lisääminen Lista ennen lisäystä: // Uusi solmu osoittamaan päähän..(); Listan keskelle (paikkaan 2) lisääminen Lista ennen lisäystä: // Haetaan edeltävä solmu. Solmu = haesolmu(paikka-1); // Luodaan solmu. Solmu = new Solmu(); // Uusi solmu listan pääksi. = ; // Luodaan solmu. Solmu = new Solmu(); // Paikassa oleva solmu. Solmu paikassa =.(); paikassa 18.21 18.22 Listan keskelle (paikkaan 2) lisääminen // setetaan solmu // viittaamaan paikan solmuun..(paikassa); // setetaan edellinen solmu // viittaamaan uuteen solmuun..(); Listan lopusta poistaminen Lista ennen poistoa: paikassa paikassa // setetaan apuviite häntään, jotta poistettavaa solmua ei hukata. Solmu poistettava = ; poistettava 18.23 18.24

Listan lopusta poistaminen Listan keskeltä (paikasta 1) poistaminen // Edellisestä solmusta häntä. = haesolmu(koko - 2); // Poistetaan viite vanhaan häntään..(); poistettava Lista ennen poistoa: // Haetaan poistettavaa solmua edeltävä solmu. Solmu = haesolmu(paikka - 1); poistettava 18.25 18.26 Listan keskeltä (paikasta 1) poistaminen // Poistettava solmu. Solmu poistettava =.(); poistettava // setetaan edellinen solmu viittaamaan poistettavaa solmua // an solmuun, jolloin poistettava solmu linkitetään pois..(poistettava.()); LinkitettyLista-luokka bstraktilista # koko: Integer LinkitettyLista 2, <<interface>> Lista + lisaalkuun(: Object) : Void + lisaaloppuun(: Object) : Void +lisaa(paikka: Integer, : Object) : oolean + poistalusta() : Object + poistalopusta() : Object + poista(paikka: Integer) : Object + (paikka: Integer) : Object + koko(): Integer + onkotyhja() : oolean poistettava 0..1 Solmu 1 bstraktilista-luokka toteuttaa Lista-rajapinnan mahdollisimman minimaalisella tavalla. Varsinainen toteutus tapahtuu konkreettisessa LinkitettyLista-luokassa. 18.27 18.28