• Keine Ergebnisse gefunden

252-0027 Einführung in die Programmierung 10.0 Generische Programmierung

N/A
N/A
Protected

Academic year: 2022

Aktie "252-0027 Einführung in die Programmierung 10.0 Generische Programmierung"

Copied!
49
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

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.

(2)

Uebersicht

§ 10.3 Mengen

§ 10.4 Abbildungen

2

(3)

Java collections framework

(4)

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

(5)

5

set.contains("to") true

set

"the" "of"

"from"

"to"

"she"

"you"

"him"

"why"

"in"

"down"

"by"

"if"

set.contains("be") false

(6)

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

(7)

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 sind sortiert gespeichert

§ LinkedHashSet: Zugriff schnell O(1), speichert Elemente in der Reihenfolge in der sie in die Menge hinzugefügt wurden.

(8)

Beispiel

§ Thomas Mann, Die Buddenbrooks, 1'602'177 Bytes

§ Quelle: Projekt Guttenberg

§ Messungen

§ Intel(R) Xeon(TM) CPU 2.80GHz 8

Klasse Zeit (ms)

LinkedList 1761

ArrayList 1242

HashSet 1100

TreeSet 1455

(9)

10

(10)

Set Methoden

11

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(collection) adds all elements from the given collection to this set

containsAll(coll) returns true if this set contains every element from given set equals(set) returns true if given other set contains the same elements iterator() returns an object used to examine set's contents (später mehr) removeAll(coll) removes all elements in the given collection from this set

retainAll(coll) removes elements not found in given collection from this set toArray() returns an array of the elements in this set

addAll retainAll removeAll

(12)

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]

(13)

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]

(14)

∀ 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

(15)

17

(16)

Reihenfolge der Iteration

§ HashSet – nicht definiert.

§ LinkedHashSet – wie eingefügt.

§ ArrayList – wie eingefügt.

§ LinkedList – wie eingefügt.

§ TreeSet – aufsteigend (nach compareTo).

19

(17)

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

(18)

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)

§ Map: Was ist die Postleitzahl der ”ETH”?

”ETH" Set true

false

”ETH" Map ”8092"

(19)

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.

§ Auch als "dictionary", "associative array",

"hash" bekannt.

myMap.get("Juliet") returns "Capulet"

(20)

Einsatz von Abbildungen

§ Eine Abbildung stellt eine Assoziation zwischen Schlüssel und Werten her.

§ Speichert einen Wert für jeden Index (Schlüssel).

§ Später brauchen wir nur einen Schlüssel angeben und erhalten den entsprechenden Wert zurück:

Dann können wir fragen: Was ist die ETH Telefonnummer?

Map get(”ETH")

"044-632-1111"

Map // key value

put(”ETH", ”044-632-1111")

(21)

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

(22)

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

(23)

§ Eine Abbildung erfordert 2 Type Parameter: einen für die Schlüssel, einen für die Werte.

// maps from String keys to Integer values Map<String, Integer> votes =

new HashMap<String, Integer>();

28

(24)

Map Methoden

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 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}"

(25)

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

(26)

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 }

(27)

33

(28)

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 }

(29)

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

(30)

Weitere Map Methoden

36

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

(31)

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

...

(32)

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

(33)

39

(34)

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)); // ???

(35)

§ 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

(36)

Korrekte Umkehrabbildung

§ Jede Note muss auf eine Sammlung (Collection) von Assistenten abgebildet werden.

Map<Double, Set<String>> note =

new HashMap<Double, Set<String>>();

(37)

43

(38)

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.

(39)

45

(40)

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.

(41)

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

}

(42)

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

}

(43)

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

(44)

53

(45)

54

index 0 1 2 3 4 5 6 7 8 9 value 3 8 9 7 5 1

2 0 0 0 0 size 6

list

current element: 9 current index: 2 iterator

set "the"

"to"

"from"

"we"

current element: "from"

next element: "the"

iterator

(46)

Iterator Methoden

§ 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();

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)

(47)

56

(48)

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

...

(49)

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

Referenzen

ÄHNLICHE DOKUMENTE

§ Programm: Folge von Anweisungen, die von einem Computer ausgeführt werden (können).. § Programm realisiert

ArrayList § Java stellt die Klasse ArrayList für solche Listenobjekte zur Verfügung § "Array" erinnert daran, dass die Elemente über einen Index erreicht werden können § Die Anzahl

set( index , value ) replaces value at given index with given value size() returns the number of elements in list.. toString() returns a string representation of the list such as

§ Definiert einen Loop über alle Elemente einer Ansammlung (z.B., Set , List – die Interface Collection implementieren) oder eines

Eine Programmiersprache sollte es möglichst einfach machen, ein Programm zu lesen. Was ist

§ Beispiel: Ein Programm soll Zahlen einlesen bis der Benutzer eine 0 eingibt; dann soll die Summe aller eingegebenen Zahlen ausgegeben werden.. § Beispiel: Ein Programm soll

(at the end of the list, or inserts them at the given index) contains( value ) returns true if given value is found somewhere in this list containsAll( list ) returns true if this

set( index , value ) replaces value at given index with given value size() returns the number of elements in list.. toString() returns a string representation of the list such as