Länkade strukturer (del 2)
Översikt Abstraktion Dataabstraktion Inkapsling Gränssnitt (Interface) Abstrakta datatyper (ADT) Programmering tillämpningar och datastrukturer 2
Abstraktion Procedurell abstraktion Skilja på vad som ska utföras och hur detta utförs Dataabstraktion Skilja på data och hur dessa organiseras och lagras Information hiding Dölja information om hur klasser och objekt är implementerade Programmering tillämpningar och datastrukturer 3
Abstrakta datatyper (ADT) Vill kunna återanvända kod Modulär kod Data + metoder som opererar på data Allt som behövs finns samlat på samma ställe Klasser med privata variabler private var Speciella metoder för att komma åt data public get() Programmering tillämpningar och datastrukturer 4
Abstrakta datatyper Ex. ArrayList (paketet java.util.*) Kapslas in i en klass Tillsammans med metoder för Allokering av önskat utrymme Automatisk utökning vid behov Insättning av element Sortering Etc. Programmering tillämpningar och datastrukturer 5
behöver tjänst utför tjänst ADT client server ArrayList klasslista = new ArrayList(); iter = klasslista.iterator(); Element femte = iter.get(5); class ArrayList { private int element; public class { private int pos; } public iterator() { return new (); } Programmering tillämpningar och datastrukturer 6
Vill bygga egen ADT classmylist{ private int element; «interface» LinkedList class My implements { private int pos; } public My iterator() { return new My(); } «interface» Programmering tillämpningar och datastrukturer 7
MyList implementeras utan insyn Vill inte behöva veta om framåt-länken heter nästa, next eller kompis Klassen MyList. fungerar som in port Ska erbjuda Sätt att komma ihåg nuvarande position Sätt att ta fram nästa/förra element Programmering tillämpningar och datastrukturer 8
MyList mylist = new MyList(); // initiera listan MyList.My iter = mylist.iterator(); // få en iterator iter.hasnext(); // slutet av listan? iter ett objekt som anroparen förvaltar själv Kommer ihåg sin position i listan Jfr bokmärken på webben Erbjuder ett antal användbara metoder Ex. finns det något nästa element? Ex. flytta fram ett steg Programmering tillämpningar och datastrukturer 9
Interfacet List Metoder: Object next(), Object previous() Ge nästa/förra element boolean hasnext(), boolean hasprevious() Finns fler element bakåt eller framåt? Programmering tillämpningar och datastrukturer 10
List interface add(object node) Lägg till detta element före den position som man står på just nu remove() Ta bort det element som returnerades sist med next() eller previous() OBS! Krav på att varje anrop på remove() föregås av anrop på next() eller previous() Annars ska runtime error genereras Programmering tillämpningar och datastrukturer 11
Få en iterator (exempel) public class Test { public void add(object obj) { LinkedList mylist = new LinkedList(); MyList.List iter = mylist.iterator(); iter.add(new Integer(3)); } } Programmering tillämpningar och datastrukturer 12
Hur implementeras iteratorn? Note that the remove() and set(object) methods are not defined in terms of the cursor position; they are defined to operate on the last element returned by a call to next or previous() Dvs. håll reda på vad iteratorn returnerade sist från next() eller previous() Programmering tillämpningar och datastrukturer 13
Hur implementeras iteratorn? -första -sista -storlek lista1 MinLista lista1 = new MinLista(); lista1.add( ); Min iter = lista1.iterator(); Anna Bertil John Kalle Pelle 0 1 2 3 4 -nuvpos -sistret iter Programmering tillämpningar och datastrukturer 14
Hur implementeras iteratorn? MittEl nästael = iter.next(); if (nästael.udda()) { iter.remove(); } Programmering tillämpningar och datastrukturer 15
Hur implementeras iteratorn? public void remove() { if (sistret!= null) { if ( ) { // början av listan första = första.nästa; } Programmering tillämpningar och datastrukturer 16
Hur implementeras iteratorn? public void remove() { sistret.nästa.förra = null; Programmering tillämpningar och datastrukturer 17
Hur implementeras iteratorn? public void remove() { sistret.nästa = null; Programmering tillämpningar och datastrukturer 18
Hur implementeras iteratorn? public void remove() { sistret = null; Programmering tillämpningar och datastrukturer 19
Hur implementeras iteratorn? iter.remove(); FEL! Omedelbart nytt anrop: Programmering tillämpningar och datastrukturer 20
MinLista class MinLista extends { class MinNod { private MinNod nästa; private Object innehåll; } class My implements { private int pos; } public My iterator() { return new My(); } «interface» List «interface» Programmering tillämpningar och datastrukturer 21
Collections «interface» Collection «interface» List AbstractCollection «interface» Set AbstractList AbstractSet «interface» SortedSet ArrayList Vector AbstractSequentialList HashSet TreeSet Stack LinkedList LinkedHashSet Programmering tillämpningar och datastrukturer 22
Utgångna klasser Vector Använd ArrayList istället Stack är dock kvar HashTable Använd HashMap istället Programmering tillämpningar och datastrukturer 23
Collection Oordnad samling Elementen har inga bestämda positioner Meningslöst med metoder som getindex(object o); getnext(); I stället används: contains(); Programmering tillämpningar och datastrukturer 24
Protokoll för Collection contains(object) add(object) remove(object) size() clear() isempty() iterator() Programmering tillämpningar och datastrukturer 25
Set Subklass till Collection Kan inte innehålla duplikat Programmering tillämpningar och datastrukturer 26
Liknar fjädrande tallrikshållare på restauranger Trycker ner en tallrik på toppen Poppar upp en tallrik från toppen Dvs. last in, first out (LIFO) Programmering tillämpningar och datastrukturer 27
Ex. stack innehållande variabelnamn minafiler namn förra nästa comp Programmering tillämpningar och datastrukturer 28
Efter push( i ); i minafiler namn förra nästa comp Programmering tillämpningar och datastrukturer 29
Efter peek(); som returnerar i i minafiler namn förra nästa comp Programmering tillämpningar och datastrukturer 30
Efter pop(); som returnerar i minafiler namn förra nästa comp Programmering tillämpningar och datastrukturer 31
Implementera stackar Lämpligt att använda datastruktur vars storlek kan förändras ArrayList LinkedList MyList Inlägg och uttag sker alltid i ena änden (toppen av stacken) Ska egentligen inte kunna söka igenom stacken efter element Programmering tillämpningar och datastrukturer 32
Implementera stackar Delegera anropen push() och pop() till minlista.add() och minlista.remove(): class MinStack { MyList stacken = new MyList(); } public push(elem item) { stacken.add(item); } Programmering tillämpningar och datastrukturer 33
Protokoll för Stack push(element) Lägg på överst Element pop() Ge mig och ta bort översta Element peek() Titta utan att röra empty() // tömmer stacken search(element) Programmering tillämpningar och datastrukturer 34
Element tas bort i början Nya element sätt in i slutet Dvs. first in, first out (FIFO) Precis som köer i affären, etc. Kö till skrivare Programmering tillämpningar och datastrukturer 35
Programmering tillämpningar och datastrukturer 36
Implementera köer Länkad lista, där man håller reda på första och sista elementet Inläggning sist Borttagning första Programmering tillämpningar och datastrukturer 37
Implementera köer, alternativ Cirkulär ArrayList Borttagning genom att flytta markören för första pos Vid fysisk borttagning skulle man behöva flytta alla element ett steg för att fylla luckan Kön kommer att krypa längs arrayen med fler och fler tomma platser i början av arrrayen Programmering tillämpningar och datastrukturer 38
Implementera köer, alternativ Lösning: Låt stacken krypa runt, dvs. efter index n fortsätta med 0 sista = (sista + 1) % kapacitet; Måste hålla reda på kapacitet (förutom position för första och sista elementet) Generellt Begränsad kapacitet (storleken på arrayen) Programmering tillämpningar och datastrukturer 39
Protokoll för Javas Queue boolean offer(element e) // enqueue (insert) Lägg in e sist i kön Returnera false om kön är full E poll() // dequeue (remove) Ta bort första elementet E peek() Titta utan att röra getsize(), isempty() Programmering tillämpningar och datastrukturer 40