252-0027 Einführung indie Programmierung I 11.0Abstrakte Datentypen ThomasR.Gross DepartmentInformatik ETHZürich Copyright(c)Pearson2013andThomasGross2016 Allrightsreserved. Uebersicht § 11.1Stacks § 11.2Warteschlangen (Queues) § 11.3Iterator § 11.4Schnittstelle vs.Implementation 2 Abstrakte Daten Typen (ADT) § InJava(insb.im CollectionFramework)beschreiben wir ADTs mit Interfaces: § Collection,Deque,List,Map,Queue,Set,SortedMap § Ein ADTkann dann aufdurch verschiedene Klassen implementiert sein: § ArrayList undLinkedList implementiert List § Stack implementiert ??? § Ooops – Stackswurden vergessen,es gibt nur eine Klasse (bzw List) Warteschlangen § Warteschlange ("Queue):Elemente werden inder Reihenfolge entfernt indersie hinzugefuegt wurden § First-In,First-Out("FIFO") § Elemente werden inderReihenfolge gespeichert inderindieSammlung hinzugefuegt wurden aber es gibt keinen Index. § Klient kann nur amAnfang hinzufuegen und amEnde 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 add(value) places given value at back of queue remove() 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() isEmpty() returns number of elements in queue returns true if queue has no elements 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 9 Warum Interface(undnicht Klasse)? § InderPraxisbrauchen wir oftQueuesmit weiteren Eigenschaften § (Dazu später mehr) § Wenn wir eine QueueInstanz brauchen müssen wir eine Klasse verwenden,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 Exception 2. Kann passieren (z.B.,es gibt keine Arbeit mehr zu erledigen) – Klient mussinformiert werden aber keine "aussergewöhnliche Situation" 3. ??? 12 1. Fehler desKlienten – throwIllegalStateException Exception § Verhalten derremove() Operation 13 3. ??? § Ein häufiges Einsatzgebiet für Queuesist Kommunikation in parallelen (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 derWarteschlange hinzufü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 eine Exceptionzu generieren 17 Arbeiten mit Queues offer(value) poll() places given value at back of queue, returns true if successful peek() returns front value from queue without removing it; returns null if queue is empty size() isEmpty() returns number of elements in queue returns true if queue has no elements removes value from front of queue and returns it; returns null if queue is empty Queue<Integer> q = new LinkedList<Integer>(); q.offer(42); // could also use add q.add(-3); // front [42, -3] back System.out.println(q.poll()); System.out.println(q.poll()); System.out.println(q.poll()); // // // // 42, could use remove instead -3, could use remove instead null remove throws exception Einsatz vonQueues § Wie bei denStacksmüssen wir denInhalt entfernen umihn anzusehen. 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 Loop initialisiert wird? 20 21 Mengen § Menge (“set”):Eine Sammlung eindeutiger undeinzigartiger Elemente (d.h.,wir lassen keine Duplikate zu undkönnen für 2beliebige Elemente feststellen,obsie gleich oder ungleich sind)für diefolgende Operationen ausgeführt werden können: § Hinzufügen (add),Entfernen (remove),Suche (contains) § Bei einer Menge erwarten wir keinen Zugriff über einen Indexund eine Reihenfolge spielt keine Rolle set.contains("to") set.contains("be") "if" "the" "to" "of" "down" "from" "by" "she" "you" "in" "why" "him" true false set 23 Set Implementierungen § InJavakönnen Mengendurch dasSet Interface(aus java.util) realisiert werden § Set wird durch dieKlassen HashSet undTreeSet implementiert Abbildungen (Maps)undMengen (Sets) § Eine Menge ist eine Abbildung (map)der Elemente auf bool’sche Werte. § Set:Ist ”ETH"inder Menge?(true/false) ”ETH" true Set false § Map: Wasist diePostleitzahl der ”ETH”? ”ETH" Map ”8092" ∀Elemente der Menge § DadieOrdnung derElemente inderMengennicht bekannt ist müssen wir einen (stabilen)Weg finden,Operationen mit allen 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 Maperhalten Map<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 -> 19 System.out.println(name + " -> " + age); // Sarah -> 57 } values § DieMethode values liefert eine Ansammlung aller inder Mapauftretenden 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 verschiedene Wö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 es aus derMenge. Mit denElementen einer Menge (Map)arbeiten § AufdieElemente eines JavaSetsoder einer JavaMap kann nicht 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 beliebigen Collection(z.B.,Set,List, Arrayoder andere) Beispiel Set<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 list index 0 1 2 3 4 5 6 7 8 9 value 3 8 9 7 5 1 2 0 0 0 0 size iterator 6 current element: 9 currentindex:2 set "the" "to" "we" "from" iterator current element: "from" next element: "the" 35 Iterator Methoden hasNext() returns true if there are more elements to examine next() 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) § Iterator ist ein Interfaceinjava.util § Jede Ansammlung stellt dieiterator() Methode zur Verfügung, dieeinen Iteratorliefert mit dem dieElemente besucht werden können. Set<String> set = new HashSet<String>(); ... Iterator<String> itr = set.iterator(); 37 Iterator Beispiel 1 Set<Integer> scores = new TreeSet<Integer>(); scores.add(94); scores.add(38); // Kim scores.add(87); scores.add(43); // Marty scores.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 grades if (score < 60) { itr.remove(); } } System.out.println(scores); // [72, 87, 94] 39 Iterator Beispiel 2 Map<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 jeder Schlüssel mit einem Wertassoziiert 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 einem Wert § get(key):Lesen desWertes dermit dem Schlüssel assoziiert ist. § remove(key):Entfernen desSchlüssels (unddesmit ihm assoziierten Wertes) 45 Map Implementation § InJava, Abbildungen (“maps”)werden durch Map Interfacein java.util unterstützt. § Map wird durch dieKlassen HashMap undTreeMap implementiert § HashMap: mit einem Array,dem "hashtable”,implementiert; sehr effizient:O(1) ; Schlüssel sind inirgendeiner Reihenfolge gespeichert. § TreeMap: mit einem binärem Baumimplementiert; ziemlich effizient:O(logN) ; Schlüssel sind sortiert gespeichert § Eine Abbildung erfordert 2TypeParameter:einen für die Schlüssel,einen für dieWerte. // maps from String keys to Integer values Map<String, Integer> votes = new HashMap<String, Integer>(); 48 Map Methoden put(key, value) containsKey(key ) adds a mapping from the given key to the given value; if the key already exists, replaces its value with the given one returns the value mapped to the given key (null if not found) returns true if the map contains a mapping for the given key remove(key) removes any existing mapping for the given key clear() removes all key/value pairs from the map size() returns the number of key/value pairs in the map isEmpty() returns true if the map's size is 0 toString() returns a string such as "{a=90, d=60, c=70}" get(key) Map Methoden keySet() returns a set of all keys in the map values() returns a collection of all values in the map putAll(map) adds all key/value pairs from the given map to this map equals(map) returns true if given map has the same mappings as this one 50 Einsatz vonAbbildungen § Eine Abbildung stellt eine Assoziation zwischen Schlüssel und Werten her. § Speichert einen Wertfür jeden Index(Schlüssel). // key value put(”ETH", ”044-632-1111") Map § Später brauchen wir nur einen Schlüssel angeben underhalten den entsprechenden Wertzurück: Dannkönnen wir fragen:Wasist dieETHTelefonnummer? get(”ETH") Map "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 der Abstraktion 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 dieBedeutung derDaten § ADTändert Fokus vonStruktur aufGebrauch § Darstellung sollte für denKlienten nicht wichtig sein § Daher sollte sie nicht sichtbar sein! class RightTriangle { double base, altitude; } class RightTriangle { double base, hypot, angle; } § Denken im Raum derOperationen § Instanzieren,getBase,getAngle,…. 57 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 die andere 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 (aufder vorherigen 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 (oder respektieren müssen) § z.B.arbeitet mit einem "Punkt ineiner 2-dimEbene mit diesen Operationen" § Entscheidung über dieImplementationdesADTkann aufgeschoben 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 ADT class Point { // A 2-d point exists in the plane, ... public double x() { … }; public double y() { … }; public double r() { … }; Observers public double theta() { … }; // ... can be created, ... public Point() { ... }; // new point at (0,0) public Point centroid(Set<Point> points) { … }; Creators/ Producers 61 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, Mutators double delta_theta) { … }; // attributes private double x; private double y; } 62 ADT=Objekte +Operationen Rest des Programms Klienten Point x y r theta translate scale_ro t "Abstraction barrier Implementation § Implementationist nicht sichtbar (versteckt) § Für Objekte desTyps gibt es nur dieOperationen,dievon 63 derAbstraktion zugelassen sind