Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
252-0027Einführung indie Programmierung I
11.0Abstrakte DatentypenThomasR.Gross
DepartmentInformatikETHZürichCopyright(c)Pearson2013andThomasGross2016Allrightsreserved.
Uebersicht
§ 11.1Stacks
§ 11.2Warteschlangen (Queues)
§ 11.3Iterator
§ 11.4Schnittstelle vs.Implementation
2
Abstrakte Daten Typen (ADT)
§ InJava(insb.im CollectionFramework)beschreiben wir ADTsmit Interfaces:§ Collection,Deque,List,Map,Queue,Set,SortedMap
§ Ein ADTkann dann aufdurch verschiedene Klassenimplementiert sein:§ ArrayList undLinkedList implementiert List§ Stack implementiert ???
§ Ooops – Stackswurden vergessen,es gibt nur eine Klasse (bzw List)
Warteschlangen
§ Warteschlange ("Queue):Elemente werden inderReihenfolge entfernt indersie hinzugefuegt wurden§ First-In,First-Out("FIFO")§ Elemente werden inderReihenfolge gespei-chert inderindieSammlung hinzugefuegtwurden aber es gibt keinen Index.
§ Klient kann nur amAnfang hinzufuegen undamEnde entfernen.
Warteschlangen
§ Wassind dieOperationen dieeine Queueanbieten muss?
§ Hinzufügen ("insert")add (enqueue): Ein ElementamSchluss derWarteschlange hinzufügen.
§ Entfernen ("remove")remove (dequeue):Dasvorderste Elemententfernen.
§ Anschauen ("examine")element:Dasvorderste Elementanschauen.
6
Warteschlangen inderInformatik
§ Betriebssysteme:§ QueuederDruckaufträge für einen Drucker§ QueuederProgramme (Prozesse)dieausgeführt werden sollen§ QueuederDatenpackete diezu sendsind bzw.dieempfangen wurden
§ Programmierung:§ Modellierung einer Schlange vonKunden oder Klienten§ Folge vonInstruktionen dieausgeführt werden sollen
Arbeiten mit Queues
Queue<Integer> q = new LinkedList<Integer>();q.add(42);q.add(-3);q.add(17); // front [42, -3, 17] back
System.out.println(q.remove()); // 42
add(value) places given value at back of queueremove() removes value from front of queue and returns it;
throws a NoSuchElementException if queue is empty
element() returns front value from queue without removing it
size() returns number of elements in queueisEmpty() returns true if queue has no elements
9
Warum Interface(undnicht Klasse)?
§ InderPraxisbrauchen wir oftQueuesmit weiterenEigenschaften§ (Dazu später mehr)
§ Wenn wir eine QueueInstanz brauchen müssen wir eine Klasseverwenden,diediesesInterfaceimplementiert.
§ Z.B.können wir LinkedList verwenden
Queue<Integer> q = new LinkedList<Integer>();
§ Queue geht nicht.
10
Erwartungen andenKlienten§ Wassollen wir machen wenn derKlient eine remove
Operationversucht unddieQueueenthält keine Elemente?
11
Erwartungen andenKlienten§ Wassollen wir machen wenn derKlient eine remove
Operationversucht unddieQueueenthält keine Elemente?1. Fehler desKlienten – throwIllegalStateException
Exception2. Kann passieren (z.B.,es gibt keine Arbeit mehr zu erledigen)
– Klient mussinformiert werden aber keine"aussergewöhnliche Situation"
3. ???
12
1. Fehler desKlienten – throwIllegalStateExceptionException
§ Verhalten derremove() Operation
13
3. ???
§ Ein häufiges Einsatzgebiet für Queuesist Kommunikation inparallelen (undverteilten)Systemen
§ Z.B.Lesen vonempfangenen (Netzwerk)Packeten§ Wenn es kein Packetgibt müssen wir warten
§ Z.B.Schicken eines Packets§ Wenn es keinen Platz gibt (oder dasNetzwerk nicht verfügbar ist)
dann wollen wir warten§ Es ist normaldass daswir nicht sofort senden können 14
15
KlassendieQueue implementieren
§ DiverseKlassenimplementieren dasQueueInterface
§ Legen z.B.Verhalten bei voller (insert)undleerer Queue(remove)fest§ ArrayBlockingQueue, LinkedBlockingDeque, SynchronousQueue
§ Arbeitet evtl.dann mit einer festen Anzahl vonQueueSlots("capacity")
16
2. Kann passieren (z.B.,es gibt keine Arbeit mehr zu erledigen)– Klient mussinformiert werden aber keine"aussergewöhnliche Situation"
§ Ein zweiter Satz vonMethoden§ Hinzufügen ("insert")
offer(enqueue):Ein ElementamSchluss derWarteschlangehinzufügen sofern es Platz gibt
§ Entfernen ("remove")poll(dequeue):Dasvorderste Elemententfernen sofern nicht leer
§ Anschauen ("examine")peek:Dasvorderste Elementanschauen.
§ Diese Methoden liefern null oder false anstatt eineExceptionzu generieren 17
Arbeiten mit Queues
Queue<Integer> q = new LinkedList<Integer>();q.offer(42); // could also use addq.add(-3); // front [42, -3] back
System.out.println(q.poll()); // 42, could use remove insteadSystem.out.println(q.poll()); // -3, could use remove insteadSystem.out.println(q.poll()); // null
// remove throws exception
offer(value) places given value at back of queue, returns true if successfulpoll() removes value from front of queue and returns it;
returns null if queue is emptypeek() returns front value from queue without removing it;
returns null if queue is emptysize() returns number of elements in queueisEmpty() returns true if queue has no elements
Einsatz vonQueues
§ Wie bei denStacksmüssen wir denInhalt entfernen umihnanzusehen.
while (!q.isEmpty()) {dosomethingwith q.remove();
}
§ Jedes Elementgenau einmal inspizieren (aber Queuenichtändern).
int size = q.size();for (int i = 0; i < size; i++) {
dosomethingwith q.remove();//undevtl.wieder indieQueue(amEnde!)einfügen
}
§ Warum brauchen wir eine separateVariablesize dievor dem Loopinitialisiert wird?
20
21
Mengen
§ Menge (“set”):Eine Sammlung eindeutiger undeinzigartigerElemente (d.h.,wir lassen keine Duplikate zu undkönnen für 2beliebigeElemente feststellen,obsie gleich oder ungleich sind)für diefolgendeOperationen ausgeführt werden können:§ Hinzufügen (add),Entfernen (remove),Suche (contains)
§ Bei einer Menge erwarten wir keinen Zugriff über einen Indexundeine Reihenfolge spielt keine Rolle
23
set.contains("to") true
set
"the" "of"
"from""to"
"she""you"
"him""why"
"in"
"down""by"
"if"
set.contains("be") false
Set Implementierungen
§ InJavakönnen Mengendurch dasSet Interface(ausjava.util) realisiert werden
§ Set wird durch dieKlassen HashSet undTreeSetimplementiert
Abbildungen (Maps)undMengen (Sets)
§ Eine Menge ist eine Abbildung (map)der Elemente aufbool’sche Werte.§ Set:Ist ”ETH"inder Menge?(true/false)
§ Map: Wasist diePostleitzahl der ”ETH”?
Set”ETH" true
false
Map”ETH" ”8092"
∀Elemente der Menge§ DadieOrdnung derElemente inderMengennicht bekannt ist
müssen wir einen (stabilen)Weg finden,Operationen mitallen Elemente einer Menge auszuführen.§ DieOperationkann einen Testeinschliessen derdann – jenach
Ergebnis – dieOperationen genauer definiert§ Wenn element.hasProperty() dann element.moreOps()
§ Idee:Schleife über alle Elemente einer Menge
26
keySet
§ DieMethode keySet liefert dieMenge (Set)aller “Keys”(Schlüssel)inderAbbildung (Map)§ Kann dieMenge aller Keysineiner foreach Schleife bearbeiten§ Kann denWertderzu einem Keygehört durch Aufruf vonget für die
MaperhaltenMap<String, Integer> ages = new TreeMap<String, Integer>();ages.put(”Roland", 19);ages.put(”Clara", 2); // ages.keySet() returns Set<String>ages.put(”Sarah", 57);for (String name : ages.keySet()) { // Clara -> 2
int age = ages.get(name); // Roland -> 19System.out.println(name + " -> " + age); // Sarah -> 57
}
values
§ DieMethode values liefert eine Ansammlung aller inderMapauftretenden Werte§ Kann über diese Werte mit einer foreach Schleife abarbeiten§ Esgibt keinen einfachen Weg dieSchlüssel für einen Wertzu finden
29
Uebung
§ Schreiben Sie ein Programm,daszählt wieviele verschiedeneWörter ineinem Textauftauchen.§ Speichern Sie dieWörter ineiner (An)Sammlung undgeben Sie die
Anzahl deraufgetretenen Wörter aus.§ Nach dem Einlesen desTextes sollte es möglich sein,festzustellen ob
ein bestimmtes Wortim Textauftritt.
§ Geben Sie jedes Wortdasmindestens 1000malauftritt aus(sortiert nach derHäufigkeit (von1000anaufwärts))undentfernen esaus derMenge.
Mit denElementen einer Menge (Map)arbeiten
§ AufdieElemente eines JavaSetsoder einer JavaMap kannnicht mittels eines Indexzugegriffen werden§ Dafür gibt es den"foreach"Loop:
Set<Integer> scores = new HashSet<Integer>();for (int score : scores) {
System.out.println("The score is " + score);}
Die"foreach”Schleife
Syntax:for (type name : collection) {
statements;}
§ Definiert einen Loopüber alle Elemente einer beliebigenCollection(z.B.,Set,List, Arrayoder andere)BeispielSet<Double> temperatures = new HashSet<Double>();...for (double measured : temperatures) {
System.out.println(”Measured Temp (F): " + measured);}
Die"foreach”Schleife§ Problem: Dieforeach Schleife ist "read-only",d.h.dieMenge darf
nicht modifiziert werden während derLoopausgeführt wird.
for (int score : scores) {if (score >= 1000) {// throws a ConcurrentModificationException
scores.remove(score);}
}
33
Iteratoren
§ Iterator("iterator"):Ein Objekt daseinem Klienten erlaubt,dieElemente einer Ansammlung zu besuchen§ Erinnert sich andie(aktuelle)Positionanderlaubt es
§ aufdasElementandieser Positionzuzugreifen§ dasElementandieser Positionzu entfernen§ abzufragen ob es weitere Elemente gibt§ zur nächsten Positionvorzurücken
35
index 0 1 2 3 4 5 6 7 8 9value 3 8 9 7 5 1
20 0 0 0
size 6
list
current element: 9currentindex:2iterator
set"the"
"to""from"
"we"
current element: "from"next element: "the"iterator
IteratorMethoden
§ Iterator ist ein Interfaceinjava.util§ Jede Ansammlung stellt dieiterator()Methode zur Verfügung,
dieeinen Iteratorliefert mit dem dieElemente besucht werdenkönnen.Set<String> set = new HashSet<String>();...Iterator<String> itr = set.iterator();
hasNext() returns true if there are more elements to examinenext() returns the next element from the collection (throws a
NoSuchElementException if there are none left to examine)remove() removes the last value returned by next() (throws an
IllegalStateException if you haven't called next() yet)
37
Iterator Beispiel 1Set<Integer> scores = new TreeSet<Integer>();scores.add(94);scores.add(38); // Kimscores.add(87);scores.add(43); // Martyscores.add(72);...
Iterator Beispiel 1(Teil 2)Iterator<Integer> itr = scores.iterator();while (itr.hasNext()) {
int score = itr.next();
System.out.println("The score is " + score);
// eliminate any failing gradesif (score < 60) {
itr.remove();}
}
System.out.println(scores); // [72, 87, 94] 39
Iterator Beispiel 2Map<String, Integer> scores = new TreeMap<String, Integer>();
scores.put("Kim", 38);
scores.put("Lisa", 94);
scores.put("Roy", 87);
scores.put("Marty", 43);
scores.put("Marisa", 72);
...
Iterator Beispiel 2 (Teil 2)
Iterator<String> itr = scores.keySet().iterator();
while (itr.hasNext()) {
String name = itr.next();
int score = scores.get(name);
System.out.println(name + " got " + score);
// eliminate any failing students
if (score < 60) {
itr.remove(); // removes name and score
}
}
System.out.println(scores); // {Lisa=94, Marisa=72, Roy=87}
41
DerADT"Map"
§ Map,Abbildung ("map"):Hält eine Menge Schlüssel (keys)undeine (An)Sammlung vonWerten (values),wobei jederSchlüssel mit einemWertassoziiert ist.§ Auch als "dictionary","associativearray","hash"bekannt.
myMap.get("Juliet") returns "Capulet"
DerADT"Map"
§ Wichtigste Operationen:§ put(key,value):Hinzufügen eines Schlüssels mit einemWert
§ get(key):Lesen desWertes dermit dem Schlüssel assoziiert ist.
§ remove(key):Entfernen desSchlüssels (unddesmit ihm assoziiertenWertes)
45
Map Implementation
§ InJava, Abbildungen (“maps”)werden durch Map Interfaceinjava.util unterstützt.
§ Map wird durch dieKlassen HashMap undTreeMapimplementiert
§ HashMap: mit einem Array,dem "hashtable”,implementiert;sehr effizient:O(1) ; Schlüssel sind inirgendeiner Reihenfolgegespeichert.
§ TreeMap: mit einem binärem Baumimplementiert;ziemlich effizient:O(logN) ; Schlüssel sind sortiert gespeichert
§ Eine Abbildung erfordert 2TypeParameter:einen für dieSchlüssel,einen für dieWerte.
// maps from String keys to Integer values
Map<String, Integer> votes =
new HashMap<String, Integer>();
48
MapMethoden
put(key, value) adds a mapping from the given key to the given value;if the key already exists, replaces its value with the given one
get(key) returns the value mapped to the given key (null if not found)
containsKey(key)
returns true if the map contains a mapping for the given key
remove(key) removes any existing mapping for the given keyclear() removes all key/value pairs from the mapsize() returns the number of key/value pairs in the mapisEmpty() returns true if the map's size is 0toString() returns a string such as "{a=90, d=60, c=70}"
MapMethoden
50
keySet() returns a set of all keys in the mapvalues() returns a collection of all values in the mapputAll(map) adds all key/value pairs from the given map to this mapequals(map) returns true if given map has the same mappings as this
one
Einsatz vonAbbildungen§ Eine Abbildung stellt eine Assoziation zwischen Schlüssel und
Werten her.§ Speichert einen Wertfür jeden Index(Schlüssel).
§ Später brauchen wir nur einen Schlüssel angeben underhalten denentsprechenden Wertzurück:
Dannkönnen wir fragen:Wasist dieETHTelefonnummer?
Mapget(”ETH")
"044-632-1111"
Map
// key valueput(”ETH", ”044-632-1111")
Lösung der1.Uebungsaufgabe// read file into a map of [word --> number of occurrences]
Map<String, Integer> wordCount = new HashMap<String, Integer>();
Scanner input = new Scanner(new File("mobydick.txt"));
while (input.hasNext()) {
String word = input.next();
if (wordCount.containsKey(word)) {
// seen this word before; increase count by 1
int count = wordCount.get(word);
wordCount.put(word, count + 1);
} else {
// never seen this word before
wordCount.put(word, 1);
}
}
Scanner console = new Scanner(System.in);
System.out.print("Word to search for? ");
String word = console.next();
System.out.println("appears " + wordCount.get(word) +
" times.");
53
Abstraktion
§ Prozedural :§ DetailsdesVerhaltens (Prozeduren,z.B.derMethoden)nicht sichtbar§ Spezifikation desVerhaltens ist dieAbstraction§ Müssen dieSpezifikation mit einer Implementationerfüllen
§ Darstellung:§ DetailsderDatendarstellung nicht sichtbar§ Auch ein Weg Eigenschaften zu spezifizieren
§ Ein Ansatzüber Programm +Daten zu folgern§ StandardTerminologie:Abstrakte DataTypen,oder ADT 54
Warum ist Daten Abstraktion sowichtig
§ Arbeiten mit Daten zentrales Thema vieler Anwendungen§ "Datenverarbeitung"§ DataScience§ Entwickeln (undBeschreiben)vonAlgorithmen seltener
§ Ueberlegen Sie sich welchen Datenstrukturen Sie brauchen§ Wie werden diewichtigen Daten organisiert?§ Welche Operationen dürfen Klienten mit denDaten machen?
55
Warum ist Daten Abstraktion sowichtig
§ Mögliche Probleme diesich beim Ausarbeiten derAbstraktion derDatendarstellung ergeben können:§ Entscheidungen für/gegen eine Datenstruktur werden zu früh gemacht§ Unnötige Wiederholungen (insbesonderen wenn Transformationen
gemacht werden)§ Spätere Aenderungen der(Kern)Datenstrukture(n)oftschwierig bzw
aufwending§ Gliederung inModulehilft ist aber nicht einfach
56
Ein ADTdefiniert Operationen
§ ADTabstrahiert dieOrganizationundbetont dieBedeutungderDaten
§ ADTändert Fokus vonStruktur aufGebrauch§ Darstellung sollte für denKlienten nicht wichtig sein
§ Daher sollte sie nicht sichtbar sein!
§ Denken im Raum derOperationen§ Instanzieren,getBase,getAngle,…. 57
class RightTriangle {double base, altitude;
}
class RightTriangle {double base, hypot, angle;
}
Sinddiese Klassengleich?class Point { class Point {
public double x; public double r;
public double y; public double theta;
} }
§ (Nein)Unterschiedlich:können nicht dieeine Klasse durch dieandere ineinem Programm ersetzen
§ (Ja)Gleich :Beide Klassenimplementieren dieIdee eines"Punktes ineiner 2-dimEbene"
58
Warum ADTs?
§ DerKlient sollte mit Operationen (Methode)arbeiten§ Nicht direkt mit Daten – dann mussdieDarstellung bekannt sein
§ Ziel derADTMethodologie ist es,dieGleichheit (aufdervorherigen Seite)auszudrücken:§ Klienten sollten mit Idee eines "Punktes ineiner 2-dimEbene"
arbeiten§ Undnicht mit derDarstellung
59
Vorteile eines Fokus aufADTs
§ Wenn Klienten dieDatenabstraktion respektieren (oderrespektierenmüssen)§ z.B.arbeitet mit einem "Punkt ineiner 2-dimEbene mit diesen
Operationen"
§ Entscheidung über dieImplementationdesADTkannaufgeschoben werden
§ Können Fehler durch Aenderung derDarstellung beheben§ Algorithmen können geändert werden
§ Um(bessere)Leistung zu erhalten§ Umbesondere Situationen auszunutzen 60
Idee eines 2-dPunktes,als ein ADTclass Point {
// A 2-d point exists in the plane, ...
public double x() { … };
public double y() { … };
public double r() { … };
public double theta() { … };
// ... can be created, ...
public Point() { ... }; // new point at (0,0)
public Point centroid(Set<Point> points) { … };
61
Observers
Creators/Producers
Idee eines 2-dPunktes,als ein ADT(Teil 2)
// ... can be moved, ...
public void translate(double delta_x, double delta_y) { … };
public void scaleAndRotate(double delta_r,
double delta_theta) { … };
// attributes
private double x;
private double y;
}62
Mutators
Pointxyrthetatranslatescale_rot
Rest desProgramms
"Abstractionbarrier
ADT=Objekte +Operationen
§ Implementationist nicht sichtbar (versteckt)§ Für Objekte desTyps gibt es nur dieOperationen,dievon
derAbstraktion zugelassen sind
Klienten Implementation
63