Einführung in die Programmierung Generische Programmierung. Thomas R. Gross. Department Informatik ETH Zürich

Ähnliche Dokumente
Einführung in die Programmierung I. 9.0 Generische Programmierung. Thomas R. Gross. Department Informatik ETH Zürich

Einführung in die Programmierung I Abstrakte Datentypen. Thomas R. Gross. Department Informatik ETH Zürich

JAVA KURS COLLECTION

OCP Java SE 8. Collections

19 Collections Framework

19 Collections Framework

12 Collections Framework. Interfaces Maps and Collections. Collection Interface. Überblick. Collection = Containterklasse, die andere Objekte enthält.

Kapitel 12: Java Collection Teil II

Kapitel 12: Java Collection Teil II

Java Einführung Collections

Nützliche Utility-Klassen des JDK

Einstieg in die Informatik mit Java

Mengen und Multimengen

Collections. Arthur Zaczek. Nov 2015

Java Schulung. Objektorientierte Programmierung in Java Teil V: Die Java Collection Klassen. Prof. Dr. Nikolaus Wulff

Mengen und Multimengen

1. Welches Interface ist nicht von Collection abgeleitet? A. B. C. D. List Set Map SortedSet. 2. Welche Aussagen sind richtig?

Programmierkurs Java

Einführung in die Programmierung. 9.0 Generische Programmierung. Thomas R. Gross. Department Informatik ETH Zürich

Datenstrukturen. Ziele

Einführung in die Programmierung I

7.0 Arbeiten mit Objekten und Klassen

Programmiertechnik II

Generische Polymorphie in Java-

Lineare Datenstrukturen: Felder, Vektoren, Listen Modelle: math. Folge (a i ) i=1.. mit Basistyp T oder: [T]

Programmierzertifikat Objekt-Orientierte Programmierung mit Java

Problem: Was ist, wenn der Stapel voll ist? Idee: Erzeuge dynamisch ein grösseres Array und kopiere um. Dynamische Anpassung der Größe

Programmieren in Java

equals und hashcode SortedSet NavigableSet Assoziative Container Programmieren II Dr. Klaus Höppner Hochschule Darmstadt Sommersemester / 32

Hashmap: Video Erklärung

Programmierkurs Java

Objektorientierte Programmierung. Kapitel 21: Einführung in die Collection Klassen

Übung Algorithmen und Datenstrukturen

Programmieren in Java

Vorlesung 07: Collections. Peter Thiemann SS 2010

Java I Vorlesung Collections

Programmiertechnik II

Die Java - Collections API

Faulheit professionell: Fertige Datenbehälter. Das Java-Collections-Framework Typsicherheit Generische Klassen

java.util. Sebastian Draack Department Informations- und Elektrotechnik Department Informations- und Elektrotechnik JAVA Collection-API

Einführung in die Programmierung Generische Programmierung. Thomas R. Gross. Department Informatik ETH Zürich

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Collections und Iteratoren ListIterator Sets. Programmieren II. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester / 22

Selbststudium OOP7 & ALG2 Auftrag

Programmieren II. Hierarchie von Collections. Vorlesung 3. Handout S. 1. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester 2010

Wo sind wir? Rudolf Berrendorf FH Bonn-Rhein-Sieg Programmiersprache Java 338

Programmieren in Java

IT I: Heute. Klasse Object. equals, hashcode, tostring. HashSet IT I - VO 6 1

Objektorientierte Implementierung

Javakurs für Fortgeschrittene

Java Generics & Collections

Informatik II Übung 7 Gruppe 7

Tutoraufgabe 1 (Collections):

Kapitel 6: Java Collection Teil I

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1

Mocking Libraries Shootout

II.4.4 Exceptions - 1 -

Heute. Nachbetrachtung Wissensüberprüfung. Sortieren Interface Comparable TreeSet Sortieren von Arrays: Arrays.sort() 3.12.

Dynamische Datenstrukturen

Software Entwicklung 1

Teil V. Generics und Kollektionen in Java

Programmierstil. Objektsammlungen. Konzepte. Zwischenspiel: Einige beliebte Fehler... Variablennamen Kommentare Layout Einrückung

Programmieren in Java

Übung Algorithmen und Datenstrukturen

Schein-/Bachelorklausur Teil 2 am Zulassung: Mindestens 14 Punkte in Teilklausur 1 und 50% der Übungspunkte aus dem 2. Übungsblock.

Kapitel 7: Java Collection Teil I

ADT: Java Collections und ArrayList

Objektsammlungen. Programmieren 2. Konzepte (Wiederholung vom Dienstag)

Programmieren II equals und hashcode

7.0 Arbeiten mit Objekten und Klassen

Programmieren 2 16 Java Collections und Generizität

STL-Container und Laufzeit

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Info B VL 14: Java Collections/Reflections

Programmiermethodik 3. Klausur Lösung

Einführung in die Programmierung mit Java

Grundkonzepte java.util.list

Bastie Sebastian Ritter. Make Java...

Einführung in die Programmierung Generische Programmierung. Thomas R. Gross. Department Informatik ETH Zürich

Abstrakte Datentypen und Java

11.0 Systematisches Programmierung

Vom objektorientierten Entwurf zur Implementierung in Java. 2. Dezember 2014

Übung Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen CS1017

Vorlesung Programmieren

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 4 ArrayList, PriorityQueue, HashSet und HashMap

Tutoraufgabe 1 (FunctionalSet):

Physikalisch Technische Lehranstalt Wedel 31. Januar 2004 Prof. Dr. Uwe Schmidt

Tutoraufgabe 1 (Implementierung eines ADTs):

Übung zur Vorlesung Programmierung

Stacks, Queues & Bags. Datenstrukturen. Pushdown/Popup Stack. Ferd van Odenhoven. 19. September 2012

Lösungshinweise/-vorschläge zum Übungsblatt 8: Software-Entwicklung 1 (WS 2017/18)

Transkript:

252-0027 Einführung in die Programmierung 10.0 Generische Programmierung Thomas R. Gross Department Informatik ETH Zürich Copyright (c) Pearson 2013 and Thomas Gross 2016 All rights reserved.

Uebersicht 10.3 Mengen 10.4 Abbildungen 2

Java collections framework

Mengen Menge ( set ): Eine Sammlung eindeutiger und einzigartiger Elemente (d.h., wir lassen keine Duplikate zu und können für 2 beliebige Elemente feststellen, ob sie gleich oder ungleich sind) für die folgende Operationen ausgeführt werden können: Hinzufügen (add), Entfernen (remove), Suche (contains) Bei einer Menge erwarten wir keinen Zugriff über einen Index und eine Reihenfolge spielt keine Rolle

set.contains("to") set.contains("be") "the" "if" "of" "to" "down" "from" "by" "she" "in" "you" "why" "him" true false set 5

Set Implementierungen In Java können Mengen durch das Set Interface (aus java.util) realisiert werden Set wird durch die Klassen HashSet und TreeSet implementiert

Set Implementierungen HashSet: Implementierung basiert auf einem hash table mit einem Array der schnelle Zugriffe erlaubt : O(1) für alle Operationen (mit bestimmten Annahmen) Elemente werden in irgendeiner (nicht bekannten) Reihenfolge gespeichert TreeSet: Implementierung basiert auf einem binären Baum"; Zugriff ist ziemlich schnell: O(log N) für alle Operationen Elemente sindsortiert gespeichert LinkedHashSet: Zugriff schnell O(1), speichert Elemente in der Reihenfolge in der sie in die Menge hinzugefügt wurden.

Beispiel Thomas Mann, Die Buddenbrooks, 1'602'177 Bytes Quelle: Projekt Guttenberg Messungen Klasse Zeit (ms) LinkedList 1761 ArrayList 1242 HashSet 1100 TreeSet 1455 Intel(R) Xeon(TM) CPU 2.80GHz 8

10

Set Methoden add(value) adds the given value to the set contains(value) returns true if the given value is found in this set remove(value) removes the given value from the set clear() removes all elements of the set isempty() returns true if the set's size is 0 tostring() returns a string such as "[3, 42, -7, 15]" 11

Operationen mit Mengen addall retainall removeall addall(collection) containsall(coll) equals(set) iterator() removeall(coll) retainall(coll) toarray() adds all elements from the given collection to this set returns true if this set contains every element from given set returns true if given other set contains the same elements returns an object used to examine set's contents (später mehr) removes all elements in the given collection from this set removes elements not found in given collection from this set returns an array of the elements in this set

Sets und Ordnungsrelationen HashSet : Elemente sind in irgendeiner Reihenfolge gespeichert Set<String> names = new HashSet<String>(); names.add("jake"); names.add("robert"); names.add("marisa"); names.add("kasey"); System.out.println(names); // [Kasey, Robert, Jake, Marisa]

Sets und Ordnungsrelationen TreeSet : Elemente werden gemäss compareto Ordnung gespeichert Set<String> names = new TreeSet<String>(); names.add("jake"); names.add("robert"); names.add("marisa"); names.add("kasey"); System.out.println(names); // [Jake, Kasey, Marisa, Robert] LinkedHashSet : in der Reihenfolge des Hinzufügens gespeichert Set<String> names = new LinkedHashSet<String>();... // [Jake, Robert, Marisa, Kasey]

Elemente der Menge Da die Ordnung der Elemente in der Mengen nicht bekannt ist müssen wir einen (stabilen) Weg finden, Operationen mit allen Elemente einer Menge auszuführen. Die Operation kann einen Test einschliessen der dann je nach Ergebnis die Operationen genauer definiert Wenn element.hasproperty() dann element.moreops() Idee: Schleife über alle Elemente einer Menge 15

17

Reihenfolge der Iteration HashSet nicht definiert. LinkedHashSet wie eingefügt. ArrayList wie eingefügt. LinkedList wie eingefügt. TreeSet aufsteigend (nach compareto). 19

Mengen (Sets) und Abbildungen (Maps) Eine Menge ist eine Abbildung (map) der Elemente auf bool sche Werte. Set: Ist ETH" in der Menge? (true/false) ETH" Set true false

Mengen (Sets) und Abbildungen (Maps) Eine Menge ist eine Abbildung (map) der Elemente auf bool sche Werte. Set: Ist ETH" in der Menge? (true/false) ETH" Set true false Map: Was ist die Postleitzahl der ETH? ETH" 8092" Map

Abbildungen ("Map") Abbildung ("map"): Hält eine Menge Schlüssel (keys) und eine (An)Sammlung von Werten (values), wobei jeder Schlüssel mit einem Wert assoziiert ist. Auchals "dictionary", "associative array", "hash" bekannt. mymap.get("juliet") returns "Capulet"

Einsatz von Abbildungen Eine Abbildung stellt eine Assoziation zwischen Schlüssel und Werten her. Speichert einen Wert für jeden Index (Schlüssel). // key value put( ETH", 044-632-1111") Map Später brauchen wir nur einen Schlüssel angeben und erhalten den entsprechendenwert zurück: Dann können wir fragen: Was ist die ETH Telefonnummer? get( ETH") "044-632-1111" Map

Abbildungen Wichtigste Operationen: put(key, value): Hinzufügen eines Schlüssels mit einem Wert get(key): Lesen des Wertes der mit dem Schlüssel assoziiert ist. remove(key): Entfernen des Schlüssels (und des mit ihm assoziierten Wertes) 25

Map Implementation In Java, Abbildungen ( maps ) werden durch Map Interface in java.util unterstützt. Map wird durch die Klassen HashMap und TreeMap implementiert HashMap: mit einem Array, dem "hash table, implementiert; sehr effizient: O(1) ; Schlüssel sind in irgendeiner Reihenfolge gespeichert. TreeMap: mit einem binärem Baum implementiert; ziemlich effizient: O(log N) ; Schlüssel sind sortiert gespeichert

Eine Abbildung erfordert 2 Type Parameter: einen für die Schlüssel, einen fürdie Werte. // maps from String keys to Integer values Map<String, Integer> votes = new HashMap<String, Integer>(); 28

Map Methoden put(key, value) get(key) containskey(key) remove(key) clear() size() 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 removes any existing mapping for the given key removes all key/value pairs from the map 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}"

Konstruktion von Abbildungen Map<KeyType, ValueType> name = new TreeMap<KeyType, ValueType>(); Könnte auch Referenzvariable TreeMap<KeyType, ValueType> name deklarieren Wollen vielleicht flexibel bleiben 31

keyset Die Methode keyset liefert die Menge (Set) aller Keys (Schlüssel) in der Abbildung (Map) Kann die Menge aller Keys in einer foreach Schleife bearbeiten Kann den Wert der zu einem Key gehört durch Aufruf von get für die Map erhalten 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 }

33

Map Verhalten Diese Abbildung (Map) speichert einen Wert (Integer) für einen Schlüssel (ein String, der Name ) Map<String, Integer> ages = new TreeMap<String, Integer>(); ages.put( Roland", 19); ages.put( Clara", 2); ages.put( Sarah", 57); ages.put( Clara", 3); // Clara had her birthday for (String name : ages.keyset()) { // Clara -> 3 int age = ages.get(name); // Roland -> 19 System.out.println(name + " -> " + age); // Sarah -> 57 }

values Die Methode values liefert eine Ansammlung aller in der Map auftretenden Werte Kann über diese Werte mit einer foreach Schleife abarbeiten Es gibt keinen einfachen Weg die Keys für einen Wert zu finden 35

Weitere Map Methoden keyset() values() putall(map) equals(map) returns a set of all keys in the map returns a collection of all values in the map adds all key/value pairs from the given map to this map returns true if given map has the same mappings as this one 36

Umkehrfunktion der Abbildung Es ist erlaubt, eine Map von Mengen, oder eine Liste von Listen, oder zu definieren. Wir wollen fürjeden Assistenten seine Durchschnittsnote festhalten. Abbildung Name->Note Map<String, Double> note = new HashMap<String, Double>(); note.put("jared", 4.6); note.put("alyssa", 5.0); note.put("steve", 5.9); note.put("stef", 4.6); note.put("rob", 4.0);...

System.out.println("Jared's Note ist " + note.get("jared")); // 4.6 Aber die Abbildung erlaubt es nicht, einfach nach all den Assistenten zu fragen, die eine bestimmte Note erreichten. Was für eine Abbildung bräuchten wir dafür? 38

39

Umkehrabbildung Wir können die Abbildung umkehren so dass es eine Abbildung von Noten auf Assistenten ist. Map<Double, String> note = new HashMap<Double, String>(); note.put(4.6, "Jared"); note.put(5.0, "Alyssa"); note.put(5.9, "Steve"); note.put(4.6, "Stef"); note.put(4.0, "Rob");... System.out.println( Wer hatte eine 4.6? " + note.get(4.6)); //???

Aber dieser Ansatz ist keine Lösung. Wo ist das Problem? Mehr als ein Assistant kann den selben Notendurchschnitt haben. Die Map speichert nur den letzten Eintrag 41

Korrekte Umkehrabbildung Jede Note muss auf eine Sammlung (Collection) von Assistenten abgebildet werden. Map<Double, Set<String>> note = new HashMap<Double, Set<String>>();

43

Korrekte Umkehrabbildung Map<Double, Set<String>> note = new HashMap<Double, Set<String>>(); note.put(4.6, new TreeSet<String>()); note.get(4.6).add("jared"); note.put(5.0, new TreeSet<String>()); note.get(5.0).add("alyssa"); note.put(5.9, new TreeSet<String>()); note.get(5.9).add("steve"); note.get(4.6).add("stef"); note.put(4.0, new TreeSet<String>()); note.get(4.0).add("rob");... System.out.println("Wer hatte eine 4.6? " + note.get(4.6)); // [Jared, Stef] Wichtig ist dass die Menge initialisiert ist bevor das 1. Element hinzugefügt wird.

45

Uebung 1. Schreiben Sie ein Programm, das zählt wieviele verschiedene Wörter in einem Text auftauchen. Speichern Sie die Wörter in einer (An)Sammlung und geben Sie die Anzahl der aufgetretenen Wörter aus. Nach dem Einlesen des Textes sollte es möglich sein, festzustellen ob ein bestimmtes Wort im Text auftritt. 2. Geben Sie jedes Wort das mindestens 1000mal auftritt aus (sortiert nach der Häufigkeit (von 1000 an aufwärts)) und entfernen es aus der Menge.

Mit den Elementen einer Menge (Map) arbeiten Auf die Elemente eines Java Sets oder einer Java Map kann nicht mittels eines Index zugegriffen 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 "for each Schleife Syntax: for (type name : collection) { } statements; Definiert einen Loop über alle Elemente einer beliebigen Collection (z.b., Set, List, Array oder andere) Beispiel Set<Double> temperatures = new HashSet<Double>();... for (double measured : temperatures) { System.out.println( Measured Temp (F): " + measured); }

Die "for each Schleife Problem: Die foreach Schleife ist "read-only", d.h. die Menge darf nicht modifiziert werden während der Loop ausgeführt wird. for (int score : scores) { if (score >= 1000) { // throws a ConcurrentModificationException scores.remove(score); } } 51

53

list index 0 1 2 3 4 5 6 7 8 9 value 3 8 9 7 5 1 2 iterator size 6 current element: 9 current index: 2 0 0 0 0 set "the" "to" "we" "from" iterator current element: "from" next element: "the" 54

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 Interface in java.util Jede Ansammlung stellt die iterator() Methode zur Verfügung, die einen Iterator liefert mit dem die Elemente besucht werden können. Set<String> set = new HashSet<String>();... Iterator<String> itr = set.iterator();

56

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] 58