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

Ähnliche Dokumente
Java Einführung Collections

JAVA KURS COLLECTION

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

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

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

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

Grundlagen der Informatik Generische Klassen

Teil V. Generics und Kollektionen in Java

Programmieren in Java

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

Vorlesung Programmieren

Vorlesung 09: Mengen. Peter Thiemann SS 2010

Probeklausur: Programmierung WS04/05

Objektorientierte Programmierung

Grundkonzepte java.util.list

Java Generics & Collections

Bäume. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 10: Collections 4. Inhalt. Bäume. Einführung. Bäume.

Einführung in die STL

Einführung in die Programmierung

1 Polymorphie (Vielgestaltigkeit)

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Programmieren in Java

Java I Vorlesung 6 Referenz-Datentypen

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

Ich liebe Java && Ich liebe C# Rolf Borst

Java Einführung Abstrakte Klassen und Interfaces

Distributed Computing Group

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

Gebundene Typparameter

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik GUI-Programmierung mit Swing

Selbststudium OOP Programmieren 1 - H1103 Felix Rohrer

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

Schnittstellen implementieren am Beispiel Suchbaum

3. Grundlegende Sprachkonstruktionen imperativer Programme

Ein Manager mit CardLayout layout/cards.java

Programmierkurs Java

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

Persistenz von Objekten relationale Datenbank Eigene Datenstruktur XML (JAXB) Proprietäre Dateiformate (Lochkarten)

Thread-Synchronisation in in Java. Threads Wechselseitiger Ausschluss Bedingte Synchronisation Beispiel: Warteschlangen

Bäume. Text. Prof. Dr. Margarita Esponda SS 2012 O4 O5 O6 O ALP2-Vorlesung, M. Esponda

Fortgeschrittene Programmiertechnik Klausur SS 2015 Angewandte Informatik Bachelor

4.4.9 Das Java Collection Framework

Geordnete Binärbäume

5.14 Generics. Xiaoyi Jiang Informatik I Grundlagen der Programmierung

Probeklausur: Programmierung WS04/05

Algorithmen und Datenstrukturen in Java Jiri Spale, Algorithmen und Datenstrukturen in Java 1

Übersicht. Vorstellung des OO-Paradigmas

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Generische Typen in Java

BTree.dll - Balancierte und verkettete Bäume. Ecofor. BTree.dll. Realisiert mit Microsoft Visual Studio /9

Programmentwicklung ohne BlueJ

Generische Datenstrukturen

Klassen und Objekte. Einführung in Java. Folie 1 von Mai Ivo Kronenberg

Java II - Übungsgruppe

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

8. Generics Grundlagen der Programmierung 1 (Java)

Musterlösungen zur Klausur Informatik 3

Datenstrukturen in Java

Algorithmen und Datenstrukturen

Allgemeine Informatik II SS :30-13:30 Uhr

Einführung in die Programmierung 1

6. Interfaces Grundlagen der Programmierung 1 (Java)

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

Computeranwendung und Programmierung (CuP)

Javakurs für Anfänger

Objects First With Java A Practical Introduction Using BlueJ. Mehr über Vererbung. Exploring polymorphism 1.0

Javakurs für Anfänger

Beispiel: Methode mit einem Fehler. Diese Methode wird problematisch, wenn von außen eine Dauer von 0 Sekunden angegeben wird, etwa im Aufruf

Enumerations und innere Klassen

Verkettete Listen. Implementierung von einfach verketteten Listen. Implementierung von doppelt verketteten Listen

Algorithmen und Programmierung II

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Objektorientierte Programmierung

JAVA - Methoden

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 13. Bäume. Bäume

Advanced Programming in C

Welche Informatik-Kenntnisse bringen Sie mit?

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Grundlagen zur nebenläufigen Programmierung in Java

Praktische Softwaretechnologie Vorlesung 3

Einstieg in die Informatik mit Java

JUnit. Unit testing unter Java

Dr. Monika Meiler. Inhalt

Brainfuck. 1 Brainfuck. 1.1 Brainfuck Geschichte und Umfeld. 1.2 Esoterische Programmiersprachen

Fortgeschrittene Programmiertechnik Klausur WS 2014/15 Angewandte Informatik Bachelor

JAVA - Methoden - Rekursion

CS1005 Objektorientierte Programmierung Bachelor of Science (Informatik)

Assoziation und Aggregation

Höhere Programmierkonzepte Testklausur

Exercise (Part I) Anastasia Mochalova, Lehrstuhl für ABWL und Wirtschaftsinformatik, Kath. Universität Eichstätt-Ingolstadt 1

Einstieg in die Informatik mit Java

Hochschule Karlsruhe Technik und Wirtschaft Anhänge: Fakultät für Informatik und Wirtschaftsinformatik SS 2013 Prof. Schmidt.

Grafik-Programmierung

Java-Schulung Grundlagen

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Studentische Lösung zum Übungsblatt Nr. 7

12) Generische Datenstrukturen

0. Einführung & Motivation

Indexing und Performance Tuning

UNIVERSITÄT ULM Fakultät für Ingenieurswissenschaften und Informatik Institut für Datenbanken und Informationssysteme

Transkript:

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

Uebersicht 9.3 Mengen 9.4 Abbildungen 2

Java collections framework

Uebung Scbreiben Sie ein Programm, das zählt wieviele verschiedene Wörter in einem Text auftauchen (z.b., Tolstois Krieg und Frieden [Война и мир] oder Goethes Faust ). Speichern Sie die Wörter in einer (An)Sammlung und geben Sie die Anzahl der aufgetretenen Wörter aus. Sind [das] Gute, gute, gut, guter, guten verschieden? Nach dem Einlesen des Textes sollte es möglich sein, festzustellen ob ein bestimmtes Wort im Text auftritt.

6

List<E> 7

LinkedList<E> 8

LinkedList Methoden add(value) add(index, value) clear() indexof(value) get(index) remove(index) set(index, value) size() tostring() appends value at end of list inserts given value just before the given index, shifting subsequent values to the right removes all elements of the list returns first index where given value is found in list (-1 if not found) returns the value at given index removes/returns value at given index, shifting subsequent values to the left replaces value at given index with given value returns the number of elements in list returns a string representation of the list such as "[3, 42, -7, 15]"

Kommt uns diese Liste bekannt vor? Die selben Methoden sind für ArrayList definiert. 11

ArrayList Methoden add(value) add(index, value) clear() indexof(value) get(index) remove(index) set(index, value) size() tostring() appends value at end of list inserts given value just before the given index, shifting subsequent values to the right removes all elements of the list returns first index where given value is found in list (-1 if not found) returns the value at given index removes/returns value at given index, shifting subsequent values to the left replaces value at given index with given value returns the number of elements in list returns a string representation of the list such as "[3, 42, -7, 15]"

Das Kleingedruckte LinkedList: get(index) braucht O(n) Zeit ArrayList: get(index) braucht O(1) Zeit 13

Praktische Analyse Müssen das Laufzeitverhalten für realistischen Input messen Was ist realistischer Input? Zeitmessungen nichteinfach Java System hat viele Komponenten (einige haben wir noch garnicht kennengelernt) und verschiedene Compiler Einfache Messung gibt uns end-to-end Uebersicht System.currentTimeMillis() Eingebaut 14

System.currentTimeMillis() Gibt die Zeit (in ms) seit 00:00, 1. Januar 1970. Typ des Rückgabewertes ist long Ein anderer Basistyp Wie int nur mit einer Darstellung die mehr bits (64) erfordert Kann wiederholt aufgerufen werden um die Ausführungszeit einer (genügend lange laufenden) Methode zu messen 15

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

Ernsthafte Evaluationen müssen viele Aspekte berücksichtigen Mehrfache Ausführung des selben Programms Durchschnitt (arithmetisch, harmonisch, geometrisch) k-out-of-n Prozessoren sind komplex Speicher Hierarchie Echte Clock Rate (hier 2793.304 MHz) Java Umgebung ist komplex 19

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ührtwerden 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") "if" "the" "to" "of" "down" "by" "in" "from" "she" "you" "why" "him" true false set 21

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 binären Baum"; Zugriff ist ziemlich schnell: O(log N) für alle Operationen Elemente sind sortiert 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 24

Set Methoden List<String> list = new ArrayList<String>();... Set<Integer> set1 = new TreeSet<Integer>(); Set<String> set2 = new HashSet<String>(list); // empty Es gibt den Defaultkonstruktor (liefert die leere Menge) und eine Konstrukor, der eine Menge basierend auf einer anderen Collection erstellt.

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]" 26

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 (seen later) 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 30

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); }

Abbildungen (Maps) und Mengen (Sets) 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

Konstruktion von Abbildungen Map<KeyType, ValueType> name = new TreeMap<KeyType, ValueType>(); Könnte auchreferenzvariable TreeMap<KeyType, ValueType> name deklarieren Wollen vielleichtflexibelbleiben 34

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(age); // Roland -> 19 System.out.println(name + " -> " + age); // Sarah -> 57 }

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 37

Umkehrfunktion der Abbildung Es ist erlaubt, eine Map von Mengen, oder eine Liste von Listen, oder zu definieren. Wir wollen für jeden 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? 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>>();

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.

Java Graphik 44

45

46

public class GraphicsProgram extends JPanel { public GraphicsProgram() { setbackground(color.white); } public static void main(string[] args) { // GraphicsProgram class is now a type of panel // since it extends the JPanel class // lets instantiate it GraphicsProgram gp = new GraphicsProgram(); Beispiel // create a new JFrame to which we will add a JPanel JFrame frame = new JFrame("Graphics!"); frame.setsize(300, 300); // add the JPanel frame.add(gp); } frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setvisible(true); 47

48

49

protected void paintcomponent(graphics g) { super.paintcomponent(g); g.setcolor(color.blue); g.drawline(30, 30, 80, 80); g.drawrect(20, 150, 100, 100); g.fillrect(20, 150, 100, 100); g.filloval(150, 20, 100, 100); Image img = Toolkit.getDefaultToolkit().getImage("img.jpg"); g.drawimage(img, 140, 140, this); } } 50

Beispiel 51