18. Abstraktit tietotyypit

Slides:



Advertisements
Samankaltaiset esitykset
Tuloksellinen Java-ohjelmointi Luku 3 Luokkien käyttäminen
Advertisements

15. Loogiset operaatiot.
Olio-ohjelmoinnin perusteet luento 3: Muuttujista ja funktioista Sami Jantunen LTY/Tietotekniikan osasto.
6. Metodit.
© Jukka Harju, Viittausmuuttujat. © Jukka Harju, Viittaukset •Viittausmuuttuja sisältää tiedon siitä missä muistipaikassa olio.
16. Javan omat luokat.
Ict1td002: Ohjelmointitaito Kertaus Osio 2 - luokat - ilmentymät - viittaus- ja arvomuuttuja - ilmentymien taulukointi HAAGA-HELIA IltaTiko.
Nämä kalvot on lisensoitu Creative Commons Attribution-ShareAlike 1
11/9/2012 © Hannu Laine 1 Tietorakenteet ja algoritmit Elegantti toteutus funktiolle insert_to_list_end Alkion lisäys sisällön mukaan järjestettyyn listaan.
2.8.3 Abstraktit tietotyypit
Tuloksellinen Java-ohjelmointi Luku 9 Taulukot ja perustietorakenteet
Taulukot Jukka Juslin © Jukka Juslin 2006.
Taulukot: Array Taulukko Javassa pitää aina perustaa (new)
Taulukoiden määrittely, käsittely ja kopiointi Vaihtoehdot taulukoille
22. Taulukot.
Ohjelmointitaito (ict1td002, 12 op) Syksy 2008
13. Pakkaukset.
Näytölle tulostaminen. 7.2 Sisällys System.out.println - ja System.out.print -operaatiot. Tulostus erikoismerkeillä. Edistyneempää tulosteiden.
OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT. LUOKKA JAVA ohjelma koostuu luokista LUOKKA sisältää metodeja molemmat sisältävät attribuutteja eli muuttujia.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Tietorakenneluokkia 2: HashMap, TreeMap.
TMA.003 / L3 ( )1 3. Funktioista 3.1. Kuvaus ja funktio Olkoon A ja B ei-tyhjiä joukkoja. Tulojoukon A  B = {(x,y) | x  A, y  B} osajoukko on.
Elinkeinopoliittinen mittaristo 2014
1.2. Tuloperiaate ja permutaatiot
Ohjelmoinnin tekniikkaa Sisällys for -lause lyhemmin. Vaihtoehtoisia merkintöjä aritmeettisille lauseille. Useiden muuttujien esittely.
TAULUKKO YKSIULOTTEINEN TAULUKKO. TAULUKKO  Taulukon tarkoitus Ohjelmassa tarvitaan paljon samantyyppisiä samaan kohdealueeseen kuuluvia muuttujia Näitä.
© Lammi-Niskala-Kossarev ADT:n toteutus Imperatiivinen paradigma Imperatiivinen paradigma toimenpiteet aktiivisia, tiedot passiivisia toimenpiteet.
Virtuaaliset jäsenfunktiot tMyn1 Virtuaaliset jäsenfunktiot Virtuaalinen jäsenfunktio on esiteltävä monimuotoisessa kantaluokassa. Virtuaalisen jäsenfunktion.
© Jukka Harju, Jukka Juslin
1 Kertaus koetta varten oleellisista asioista Jukka Juslin.
7. Oliot ja viitteet.
Map-luokka Mikä Map on? Mapin esittely ja luonti Map-luokan metodeja Mappiin lisääminen Mapin läpikäynti Mapista poistaminen 1.
2.8 TIETO- JA TALLETUSRAKENTEET
Tietotyypit Tietotyyppi määrittää muuttujan sisältämän datan luonnetta, muistista tarvittavaa tilaa ja sitä, millaisia operaatioita siihen voidaan kohdistaa.
20. Javan omat luokat.
4. Attribuutit 4.1. Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2.
5. Kapselointi Yleistä Kapseloinnilla (encapsulation) tarkoitetaan luokan tietojen ja toimintojen pakkaamista yhdeksi suojatuksi kokonaisuudeksi.
10. Abstrakti luokka Johdanto Abstrakti luokka (abstract class) poikkeaa konkreettisesta luokasta (ei-abstrakti luokka) siten, että siitä ei.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
Hyvä ohjelmointitapa (osa 2) Yleistä Lisää hyviä ohjelmointikäytäntöjä: − Jaa pitkä koodi osiin. − Käytä attribuutteja säästeliäästi.
22. Taulukot.
17. Kooste Kooste Kooste (aggregation) on luokkien A ja B välinen suhde, joka tarkoittaa “A on B:n osa” tai “A kuuluu B:hen”. − Koostesuhteessa.
Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen
Harjoitustyö 1. Olio-ohjelmoinnin perusteet | Kevät 2015 | Jorma Laurikkala2 Harjoitustyö Tehtävä: ohjelmoi lötköjen kansoittamaa alkulimaa simuloiva.
2. Lisää Java-ohjelmoinnin alkeita
Oliot ja luokat Oliot ja luokat Oliot (object) ja luokat (class) ovat keskeisiä olio- ohjelmoinnin käsitteitä. Olio-ohjelmointi on ohjelmointiparadigma,
Olioiden taulukointi Perustaulukon käyttö Luokan ilmentymät voidaan tallettaa taulukkoon samoin kuin muuttujat Esimerkki talletetaan taulukkoon opintojaksojen.
11. Rajapinnat Sisällys Mitä rajapinnat ovat? Kuinka ne määritellään ja otetaan käyttöön? Moniperiytyminen rajapintojen avulla. Varoituksen.
Javascript 2: Ohjelmointikielen ominaisuudet Jaana Holvikivi Metropolia.
1 © Jukka Juslin Luokat, attribuutit ja metodit Yleistietoa: seuraavalla koulutusviikolla tarkempi käsittely.
14. Poikkeukset Sisällys Johdanto poikkeuksiin. Poikkeusten käsittely: − Poikkeusten käsittely paikallisesti. − Poikkeusten heittäminen. Exception.
15. Ohjelmoinnin tekniikkaa
Listat eli luettelot listaelementit ovat lohkoelementtejä:  lista ja listan alkiot alkavat uudelta riviltä  listan jälkeen tuleva elementti alkaa uudelta.
Linkitetty lista Joukko alkioita jotka on kytketty toisiinsa linkeillä Listan alkio sisältää talletettavan datan ja linkin seuraavan alkioon Alkion lisääminen.
16. Javan omat luokat Sisällys Johdanto. Object -luokka: − toString -, equals -, clone - ja getClass -metodit. Comparable -rajapinta: − compareTo.
5. Kapselointi.
11. Rajapinnat.
2. Taulukot.
17. Javan omat luokat.
7. Hyvä ohjelmointitapa..
3. Luokat, oliot ja metodit Java-kielessä (Lausekielinen ohjelmointi I ja II –kursseilla opitun kertausta.)
Toisto Toistolausekkeet for, while(ehto){…} ja do {…} while(ehto)
2. Taulukot.
7. Oliot ja viitteet.
13. Pakkaukset.
16. Javan omat luokat.
7. Näytölle tulostaminen
3. Attribuutit.
4. Luokan testaus ja käyttö olion kautta
eli oliotiedostojen käsittely
Esityksen transkriptio:

18. Abstraktit tietotyypit

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

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.

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.

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.

Johdanto Abstraktin tietotyypin idea on hyvin samankaltainen kuin luokkien, mutta abstraktit tietotyypit ovat olio-ohjelmointia 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.

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

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.

Esimerkki Luodaan tyhjä, maksimissaan 5 alkiota sisältävä pino. lisää(C) koko() = 3 lisää(D) koko() = 4 lisää(A) koko() = 1 onkoTyhjä() = false lisää(B) koko() = 2 A B A D C B A

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

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.

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.

Esimerkki Luodaan tyhjä, maksimissaan 5 alkiota sisältävä jono. lisää(A), koko() = 1, onkoTyhjä() = false lisää(B), koko() = 2 lisää(C), koko() = 3, lisää(D), koko() = 4 A A B A B C D

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

Linkitetty lista Linkitetty lista (linked list) on tietorakenne, joka koostuu toisiinsa viittaavista solmuista (node). Taulukon tapaan 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.

Yhteen suuntaan linkitetty lista (YSLL) Solmu = tietoalkio + viite seuraavaan solmuun. public class Solmu { private Object alkio; private Solmu seuraava; public Solmu(Object uusi) { alkio = uusi; seuraava = null; } ... String sana1 = new String("kissa"); Solmu s = new Solmu(sana1); s Solmu-olio seuraava null alkio "kissa" sana1

Yhteen suuntaan linkitetty lista (YSLL) Pää (head) on listan ensimmäinen solmu. Häntä (tail) on listan viimeinen solmu. Viimeinen viite osoittaa null-arvoon. Esim. Kolmisolmuinen YSLL, jonka tietoalkiot ovat merkkijonoja. alkio paa Solmu-olio "kissa" seuraava "istuu" "katolla" hanta null

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.

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.

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.

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

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

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

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

Listan lopusta poistaminen // Edellisestä solmusta uusi häntä. hanta = haeSolmu(koko - 2); // Poistetaan viite vanhaan häntään. hanta.seuraava(null); "musta" paa hanta "istuu" null "katolla" poistettava "kissa" "musta" paa "kissa" null "katolla" hanta "istuu" poistettava

Listan keskeltä (paikasta 1) poistaminen Lista ennen poistoa: // Haetaan poistettavaa solmua edeltävä solmu. Solmu edeltava = haeSolmu(paikka - 1); "musta" paa "kissa" null hanta "istuu" null hanta "istuu" "kissa" "musta" paa edeltava

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

LinkitettyLista-luokka Solmu seuraava 1 0..1 AbstraktiLista-luokka toteuttaa Lista-rajapinnan mahdollisimman minimaalisella tavalla. Varsinainen toteutus tapahtuu konkreettisessa LinkitettyLista-luokassa. LinkitettyLista <<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 # koko: Integer paa, hanta 2