18. Abstraktit tietotyypit 18.1

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

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

Listarakenne (ArrayList-luokka)

TIETORAKENTEET JA ALGORITMIT

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

7/20: Paketti kasassa ensimmäistä kertaa

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

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

Olio-ohjelmointi Javalla

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

2. Perustietorakenteet

20. Javan omat luokat 20.1

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

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

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

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

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

Ohjelmointi 1 Taulukot ja merkkijonot

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

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Java-kielen perusteet

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

Java kahdessa tunnissa. Jyry Suvilehto

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

Algoritmit 1. Luento 4 Ke Timo Männikkö

17. Javan omat luokat 17.1

Algoritmit 2. Luento 7 Ti Timo Männikkö

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

17. Javan omat luokat 17.1

Algoritmit 2. Luento 2 To Timo Männikkö

16. Javan omat luokat 16.1

Ohjelmoinnin perusteet Y Python

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

9. Periytyminen Javassa 9.1

Olio-ohjelmointi Syntaksikokoelma

Mikä yhteyssuhde on?

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

Ohjelmoinnin jatkokurssi, kurssikoe

Algoritmit 2. Luento 2 Ke Timo Männikkö

Ohjelmointi 2 / 2010 Välikoe / 26.3

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

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

Java-kielen perusteet

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Rakenteiset tietotyypit Moniulotteiset taulukot

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

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

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

Rajapinta (interface)

Algoritmit 1. Luento 6 Ke Timo Männikkö

2. Olio-ohjelmoinista lyhyesti 2.1

Taulukot. Jukka Harju, Jukka Juslin

Luokan sisällä on lista

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

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

Java-kielen perusteet

15. Ohjelmoinnin tekniikkaa 15.1

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

Metodien tekeminen Javalla

Tietorakenteet, laskuharjoitus 3, ratkaisuja

Tietorakenteet ja algoritmit

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

ITKP102 Ohjelmointi 1 (6 op)

Lyhyt kertaus osoittimista

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

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

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

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

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

4. Olio-ohjelmoinista lyhyesti 4.1

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

TIEA341 Funktio-ohjelmointi 1, kevät 2008

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

UML ja luokkien väliset suhteet

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

Javan perusteita. Janne Käki

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005

7. Oliot ja viitteet 7.1

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

ITKP102 Ohjelmointi 1 (6 op)

Tietorakenteet ja algoritmit

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

Ohjelmoinnin peruskurssien laaja oppimäärä

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

15. Ohjelmoinnin tekniikkaa 15.1

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

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

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

1. Omat operaatiot 1.1

Algoritmit 1. Luento 3 Ti Timo Männikkö

7. Näytölle tulostaminen 7.1

Luokan muodostimet (Constructors)

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

3. Binääripuu, Java-toteutus

Transkriptio:

18. Abstraktit tietotyypit 18.1

Sisällys Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.2

Johdanto Javan omat tietotyypit ovat jo tuttuja: alkeistietotyypit (esimerkiksi int ja double) ja viitetietotyypit (luokat, rajapinnat ja taulukot). Abstrakti 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. 18.3

Johdanto Abstrakti 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. Abstraktin tietotyypin käyttäjä ei ole kiinnostunut tietorakenteesta vaan nimenomaan tietotyypin tarjoamista operaatioista. 18.4

Johdanto Esim. Abstraktin tietotyypin Aika 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 alkioksi. 18.5

Johdanto Abstraktin 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. Abstrakti tietotyyppi voidaan siis toteuttaa näppärästi kapseloituna luokkana. 18.6

Pino Pino (stack) on abstrakti tietotyyppi, jossa lisättävä alkio menee aina pinon päälle ja poistettava alkio otetaan aina pinon päältä. Last-In-First-Out (LIFO) periaate. Lisäykset ja poistot alkio kerrallaan. Analogiana 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). 18.7

Pinon operaatioita lisää(alkio a): lisää alkion a pinon päälle, mikäli pinoon mahtuu vielä uusi alkio. poista(): palauttaa ja poistaa pinon päällimmäisen alkion, mikäli pinossa on alkioita. koko(): alkioiden lukumäärä ( 0) pinossa. onkotyhjä(): palauttaa totuusarvon true, jos pino on tyhjä ja totuusarvon false, jos pinossa ainakin yksi alkio. ylin(): palauttaa päällimmäisen alkion sitä poistamatta, mikäli pinossa on alkioita. Tietorakenne: esimerkiksi taulukko tai linkitetty lista. 18.8

Esimerkki Luodaan tyhjä, maksimissaan 5 alkiota sisältävä pino. lisää(a) koko() = 1 onkotyhjä() = false A lisää(b) koko() = 2 B A lisää(c) koko() = 3 lisää(d) koko() = 4 D C B A 18.9

Esimerkki lisää(e) poista() = E poista() = D poista() = A Pino täynnä: koko() = 4 koko() = 3 Pino tyhjä: koko() = 5 ylin() = D poista() = C koko() = 0 E D koko() = 4 D koko() = 2 poista() = B koko() = 1 onkotyhjä() = true C C B B A A A 18.10

Jono Jono (queue) on abstrakti tietotyyppi, jossa lisättävä alkio menee aina jonon loppuun ja poistettava alkio otetaan aina jonon alusta. First-In-First-Out (FIFO) periaate. Lisäykset ja poistot alkio kerrallaan. Esim. Ruokalan jono, jossa ensiksi tullutta asiakasta palvellaan ensiksi ja uudet asiakkaat sijoittuvat kiltisti jonon loppuun. 18.11

Jonon operaatioita lisää(alkio a): lisää alkion a jonon loppuun, mikäli jonossa on vielä tilaa. poista(): palauttaa ja poistaa ensimmäisen alkion jonosta, mikäli jono ei ole tyhjä. koko(): alkioiden lukumäärä ( 0) jonossa. onkotyhjä(): palauttaa totuusarvon true, jos jono on tyhjä ja totuusarvon false, jos jonossa ainakin yksi alkio. keula(): palauttaa jonon ensimmäisen alkion sitä poistamatta, mikäli jono ei ole tyhjä. Tietorakenne: esimerkiksi taulukko tai linkitetty lista. 18.12

Esimerkki Luodaan tyhjä, maksimissaan 5 alkiota sisältävä jono. lisää(a), koko() = 1, onkotyhjä() = false lisää(b), koko() = 2 A A B lisää(c), koko() = 3, lisää(d), koko() = 4 A B C D 18.13

Esimerkki lisää(e), Jono täynnä: koko() = 5 poista() = A, koko() = 4, keula() = B, koko() = 4 poista() = B, koko() = 3, poista() = C, koko() = 2, poista() = D, koko() = 1 poista() = E, Jono tyhjä: koko() = 0, onkotyhjä() = true A B C D E B C D E E 18.14

Linkitetty lista Linkitetty lista (linked list) on tietorakenne, joka koostuu toisiinsa viittaavista solmuista (node). Taulukon tan listan alkioilla on järjestys ja alkioihin 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: Alkioiden lisääminen ja poistaminen muuttaa listan kokoa. Yksinkertaisin muoto yhteen suuntaan linkitetty lista. 18.15

Yhteen suuntaan linkitetty lista (YSLL) Solmu = tietoalkio + viite seuraavaan solmuun. String sana1 = new String(); Solmu s = new Solmu(sana1); public class Solmu { private Object alkio; private Solmu seuraava; public Solmu(Object uusi) { alkio = uusi; s Solmu-olio alkio seuraava } seuraava = ; }... sana1 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 tietoalkiot ovat merkkijonoja. Solmu-olio seuraava Solmu-olio seuraava Solmu-olio seuraava alkio alkio alkio "istuu" "katolla" 18.17

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.18

YSLL:n operaatiot lisääalkuun(alkio a): Lisää listalle uuden pään, joka sisältää alkion a. lisääloppuun(alkio a): Lisää listalle uuden hännän, joka sisältää alkion a. lisää(int indeksi, Alkio a): Lisää annettuun listan kohtaan uuden solmun, joka sisältää alkion a. poistaalusta(): Poistaa listan pään ja palauttaa pään alkion. poistalopusta(): Poistaa listan hännän ja palauttaa hännän alkion. poista(int indeksi): Poistaa solmun annetusta kohdasta ja palauttaa poistetun solmun alkion. 18.19

YSLL:n operaatiot alkio(int indeksi): Palauttaa annetussa kohdassa olevan solmun alkion. korvaa(int indeksi, Alkio a) Korvaa annetussa kohdassa olevan solmun tietoalkion annetulla alkiolla 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.20

Listan alkuun lisääminen Lista ennen lisäystä: // Uusi solmu osoittamaan päähän. uusi.seuraava(); uusi "katolla" "katolla" // Luodaan uusi solmu. Solmu uusi = new Solmu(alkio); // Uusi solmu listan pääksi. = uusi; uusi uusi "katolla" 18.21

Listan keskelle (paikkaan 2) lisääminen Lista ennen lisäystä: // Haetaan edeltävä solmu. Solmu edeltava = haesolmu(paikka-1); edeltava "katolla" "katolla" // Luodaan uusi solmu. Solmu uusi = new Solmu(alkio); // Paikassa oleva solmu. Solmu paikassa = edeltava.seuraava(); uusi edeltava paikassa "istuu" "katolla" 18.22

Listan keskelle (paikkaan 2) lisääminen // Asetetaan uusi solmu // viittaamaan paikan solmuun. uusi.seuraava(paikassa); uusi // Asetetaan edellinen solmu // viittaamaan uuteen solmuun. edeltava.seuraava(uusi); uusi "istuu" "istuu" edeltava paikassa edeltava paikassa "katolla" "katolla" 18.23

Listan lopusta poistaminen Lista ennen poistoa: "istuu" "katolla" // Asetetaan apuviite häntään, jotta poistettavaa solmua ei hukata. Solmu poistettava = ; poistettava "istuu" "katolla" 18.24

Listan lopusta poistaminen // Edellisestä solmusta uusi häntä. = haesolmu(koko - 2); poistettava "istuu" "katolla" // Poistetaan viite vanhaan häntään..seuraava(); poistettava "istuu" "katolla" 18.25

Listan keskeltä (paikasta 1) poistaminen Lista ennen poistoa: "istuu" // Haetaan poistettavaa solmua edeltävä solmu. Solmu edeltava = haesolmu(paikka - 1); edeltava "istuu" 18.26

Listan keskeltä (paikasta 1) poistaminen // Poistettava solmu. Solmu poistettava = edeltava.seuraava(); edeltava poistettava "istuu" // Asetetaan edellinen solmu viittaamaan poistettavaa solmua // seuraavaan solmuun, jolloin poistettava solmu linkitetään pois. edeltava.seuraava(poistettava.seuraava()); edeltava poistettava "istuu" 18.27

LinkitettyLista-luokka AbstraktiLista # koko: Integer LinkitettyLista 2, 0..1 Solmu 1 seuraava <<interface>> Lista + lisaaalkuun(alkio: Object) : Void + lisaaloppuun(alkio: Object) : Void +lisaa(paikka: Integer, alkio: Object) : Boolean + poistaalusta() : Object + poistalopusta() : Object + poista(paikka: Integer) : Object + alkio(paikka: Integer) : Object + koko(): Integer + onkotyhja() : Boolean AbstraktiLista-luokka toteuttaa Lista-rajapinnan mahdollisimman minimaalisella tavalla. Varsinainen toteutus tapahtuu konkreettisessa LinkitettyLista-luokassa. 18.28