252-0027 Einführungin dieProgrammierung 10.0 … · 2019. 12. 3. · Übersicht §10.1 Einleitung...

Preview:

Citation preview

252-0027Einführung in die Programmierung

10.0 Generische ProgrammierungThomas R. Gross

Department InformatikETH ZürichCopyright (c) Pearson 2013 and Thomas Gross 2016, 2019All rights reserved.

Übersicht

§ 10.1 Einleitung

§ 10.2 ArrayList<T>§ ArrayList<String>§ Wrapper Typen

§ 10.3 Vergleichen von Objekten

§ 10.4 Mengen

§ 10.5 Abbildungen

§ 10.6 Iteratoren 2

Bemerkungen zu Vorlesung und Prüfung

3

4

Ende Oktober

5

November

6

Ende Oktober

7

§ ein bisschen mehr Eclipse in der Vorlesung

§ Tempo dür5e etwas schneller sein.

§ Besser machen

§ Für mich ist es schwierig Ansätze nachzuschlagen, da wir nurdie Vorlesungsfolien haben.§ hAps://www.lst.inf.ethz.ch/educaDon/einfuehrung-in-die-

programmierung-i--252-0027-.html§ hAps://docs.oracle.com/javase/tutorial/tutorialLearningPaths.html

§ Manchmal sind die Beispiele etwas unnöDg, da man währendder Vorlesung nicht wirklich Zeit hat, einen langen Code genauzu studieren.

8

Prüfung§ Was ich weiss:

§ Am 23. 1. 2020§ Türöffnung 9:00 morgens

§ Programmierprüfung (am Computer) und schriftlichePrüfung (auf Papier)§ Programmierprüfung: 3 Stunden§ Schriftlich: 1 Stunde§ Keine Pause zwischen den Blöcken

9

Alle Angaben ohne Gewähr. Änderungen möglich. Die Prüfungsplanstelle und das VLV sind massgebend.

Prüfung

§ Umfang:§ Inhalt der Vorlesung§ Probeprüfung wird noch zur Verfügung gestellt (VIS hat auch einige

alte Prüfungen)§ NEU: 1 Std mehr für Programmierprüfung (als 2018/19) [mehr Zeit,

nicht mehr Arbeit oder mehr Punkte]

§ Mitbringen:§ Legi§ ggf Wörterbuch (E-D, F-D, F-E, I-E, I-D, ….)

§ Ohne Java Notizen! 10

Prüfungsumgebung§ Eclipse (wie in Studentenarbeitsräumen, HG )

§ Liste (nur Englisch verfügbar) § Projekte im workspace

§ Linux (aber brauchen Sie nicht wirklich)

§ (Hoffentlich) offizielle Java 11 Dokumentation [Englisch!]§ Nicht garantiert§ Direkter Zugriff aus Eclipse

§ Üben Sie mit Eclipse§ Viele gute Features

11

Weitere Informationen

§ (Hoffentlich) US Tastaturen verfügbar§ eMail Anfang Januar 2020§ Nicht garantiert und auch nicht wirklich entscheidend

§ Keine Mobiltelefone, Tablets, Smartwatches etc in den Prüfungsräumen (zuhause oder in Rucksack lassen)

§ Prüfung auf Deutsch

§ Antworten auf Englisch akzeptiert

§ Weitere Informationen später, Web Seite beobachten13

Bewertung§ Programmieraufgaben müssen Testsuite behandeln können

§ Wir geben einige Tests vor, andere sollten Sie selbst schreiben

§ Das Programm muss übersetzt und ausgeführt werdenkönnen.

14

Teilpunkte

§ Wieviele Punkte soll eine unvollständige Lösung geben?

§ Sie sollen eine 1'182 m lange Brücke bauen

§ 210 m (18%) der Brücke stürzt ein

§ 82% der Brücke bleibt stehen.

15

Bewertung

§ Programmieraufgaben müssen Testsuite behandeln können§ Wir geben einige Tests (Suite BT) vor, andere sollten Sie selbst

schreiben§ Es gibt weitere Tests für die Bewertung

§ Ähnlich wie bei Bonusaufgaben (je mehr Tests korrektbehandelt werden desto besser)§ Korrektheit – nicht Laufzeit (innerhalb vernüftiger Grenzen)§ Wenn Ihr Programm die Tests in BT ohne Timeout ausführen kann

dann sind Sie auf der sicheren Seite 18

Übersicht

§ 10.1 Einleitung

§ 10.2 ArrayList<T>§ ArrayList<String>§ Wrapper Typen

§ 10.3 Vergleichen von Objekten

§ 10.4 Mengen

§ 10.5 Abbildungen

§ 10.6 Iteratoren 19

Arbeiten mit Set ExemplarenList<String> list = new ArrayList<String>();...Set<String> set1 = new TreeSet<String>(list); Set<String> set2 = new HashSet<String>(list);

§ Oft wissen wir nicht welche Art Set am besten ist§ Daher wollen wir unsere Programme flexibel lassen

§ Verwenden des Interfaces als Typ für Parameter und Attribute/Variableboolean method(Set<String> s)

21

Set Methoden

22

add(value) adds the given value to the setcontains(value) returns true if the given value is found in this setremove(value) removes the given value from the setclear() removes all elements of the setisEmpty() returns true if the set's size is 0toString() returns a string such as "[3, 42, -7, 15]"

Operationen mit Mengen

addAll(collection) adds all elements from the given collection to this setcontainsAll(coll) returns true if this set contains every element from given setequals(set) returns true if given other set contains the same elementsiterator() returns an object used to examine set's contents (später mehr)removeAll(coll) removes all elements in the given collection from this setretainAll(coll) removes elements not found in given collection from this settoArray() returns an array of the elements in this set

addAll retainAll removeAll

23

Mengen und Ordnungsrelationen§ HashSet : Elemente sind in irgendeiner Reihenfolge

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

24

Mengen und Ordnungsrelationen§ TreeSet : Elemente werden gemäss compareTo

Ordnung gespeichertSet<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ügensgespeichertSet<String> names = new LinkedHashSet<String>();...// [Jake, Robert, Marisa, Kasey] 25

∀ Elemente der Menge

§ Da die Ordnung der Elemente in der Mengen nicht bekanntist müssen wir einen (stabilen) Weg finden, Operationen mitallen 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 (An)Sammlung§ Menge Spezialfall

26

Die "for each" SchleifeSyntax:for (type name : collection) {

statements;}

type: Typ der Elemente der Collectionname: Variable (nur innerhalb des Loops definiert)

§ Definiert einen Loop über alle Elemente einer Ansammlung(z.B., Set, List) die das Interface Collectionimplementieren oder eines Arrays

27

29

Beispiel

Set<Double> scores = new HashSet<Double>();scores.add(21.0);scores.add(20.0);scores.add(24.0);scores.add(0.0);

//Double ist ein Wrapper Typ!for (Double score : scores) {

System.out.println("The score is " + score);}

Map<String, Double> staff = new HashMap<String, Double>();staff.put("Peter", 1.0);staff.put("Mary", 6.0);

for (String s : staff.keySet()) {System.out.println("Info: " + s +" -- " + staff.get(s));

}

30

Beispiel

Set<Double> scores = new HashSet<Double>();scores.add(21.0);scores.add(20.0);scores.add(24.0);scores.add(0.0);

//Double ist ein Wrapper Typ!for (double score : scores) {

System.out.println("The score is " + score);}

Map<String, Double> staff = new HashMap<String, Double>();staff.put("Peter", 1.0);staff.put("Mary", 6.0);

for (String s : staff.keySet()) {System.out.println("Info: " + s +" -- " + staff.get(s));

}

31

Reihenfolge der Iteration§ HashSet – nicht definiert.

§ LinkedHashSet – wie eingefügt.§ ArrayList – wie eingefügt.

§ LinkedList – wie eingefügt.§ TreeSet – aufsteigend (nach compareTo).

32

10.5 Abbildungen

34

Mengen (Sets)§ Eine Menge ist eine Abbildung (map) der Elemente auf

bool’sche Werte.§ Set: Ist "ETH" in der Menge? (true/false)

Set"ETH" true

false

35

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

Set"ETH" true

false

Map"ETH" "8092"

36

Abbildungen ("Map")§ Abbildung ("map"): Hält eine Menge Schlüssel (keys) und

eine (An)Sammlung von Werten (values), wobei jederSchlüssel mit einem Wert assoziiert ist. § Auch als "dictionary", "associative array",

"hash" bekannt.

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

37

38

Einsatz von Abbildungen§ Eine Abbildung stellt eine Assoziation zwischen

Schlüssel(key) und Werten her.§ Speichert einen Wert für jeden Key (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?

Mapget("ETH")

"044-632-1111"

Map

// key valueput("ETH", "044-632-1111")

40

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

41

Map Implementation§ In Java, Abbildungen ("maps") werden durch das Map

Interface in java.util unterstützt§ Muss importiert werden§ Verschiedene Implementationen

§ Wichtige Klassen die Map implementieren sind HashMap, LinkedHashMap und TreeMap

43

Map Implementation

§ HashMap: Schlüssel sind in einem Array, dem "hash table", gespeichert, in irgendeiner Reihenfolge gespeichertZugriff sehr effizient: O(1)

§ LinkedHashMap: Zugriff schnell O(1), speichert Elementein der Reihenfolge in der sie in die Abbildung hinzugefügtwurden

§ TreeMap: Schlüssel in einem binärem Baum gespeichert; Schlüssel sind sortiert gespeichertZugriff ziemlich effizient: O(log N) 44

§ Eine Abbildung erfordert zwei Typ 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>();

45

46

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

48

Konstruktion von AbbildungenMap<KeyType, ValueType> name = new TreeMap<KeyType,

ValueType>();

§ Könnte auch auch spezifische ReferenzvariableTreeMap<KeyType, ValueType> name

deklarieren

§ Wollen vielleicht flexibel bleiben

49

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

50

Roland

Clara SarahTyp ist String – daher entscheidetcompareTo der Klasse String die Ordnung

51

keySet()

§ Die Methode keySet liefert die Menge (Set) aller "Keys" (Schlüssel) in der Abbildung (Map)§ Kann die Menge aller Keys in einer for each Schleife bearbeiten§ Kann den Wert, der zu einem Key gehört, durch Aufruf von get für

die Map erhalten

§ Für Map<KeyType, ValueType> name heisst das:name.keySet() liefert ein Set<KeyType>

52

keySet() BeispielDie Methode keySet liefert die Menge (Set) aller "Keys" (Schlüssel) in der Abbildung (Map)

Map<String, Integer> ages = new TreeMap<String, Integer>();ages.put("Roland", 19);ages.put("Clara", 2); ages.put("Sarah", 57);

// ages.keySet() returns Set<String>

for (String name : ages.keySet()) { // Clara -> 2int age = ages.get(name); // Roland -> 19System.out.println(name + " -> " + age); // Sarah -> 57

} 53

keySet() BeispielDie Methode keySet liefert die Menge (Set) aller "Keys" (Schlüssel) in der Abbildung (Map)

Map<String, Integer> ages = new TreeMap<String, Integer>();ages.put("Roland", 19);ages.put("Clara", 2); ages.put("Sarah", 57);

// ages.keySet() returns Set<String>// here: ["Clara","Roland","Sarah"]

for (String name : ages.keySet()) { // Clara -> 2int age = ages.get(name); // Roland -> 19System.out.println(name + " -> " + age); // Sarah -> 57

} 54

put(…) überschreibt!§ 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 -> 3int age = ages.get(name); // Roland -> 19System.out.println(name + " -> " + age); // Sarah -> 57

}57

values()

§ Die Methode values liefert eine Ansammlung aller in derMap auftretenden Werte§ Kann diese Werte mit einer for each Schleife abarbeiten§ Aber: Es gibt keinen einfachen Weg die Keys für einen Wert zu finden

59

Weitere MapMethoden

60

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

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 Durchschnittsnotefesthalten. Abbildung Name->NoteMap<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);... 61

63

4.0

4.6

5.0

5.9

"Rob"

"Alyssa"

"Jared"

" Stef"

" Steve"

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?

64

Umkehrabbildung§ Wir könnten 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)); // ???65

66

4.0

4.6

5.0

5.9

"Rob"

"Alyssa"

"Jared"

" Stef"

" Steve" 4.0

4.6

5.0

5.9

" Jared "

67

4.0

4.6

5.0

5.9

"Rob"

"Alyssa"

"Jared"

" Stef"

" Steve" 4.0

4.6

5.0 "Alyssa"

" Jared "

68

4.0

4.6

5.0

5.9

"Rob"

"Alyssa"

"Jared"

" Stef"

" Steve" 4.0

4.6

5.0

5.9

"Alyssa"

" Jared "

" Steve"

69

4.0

4.6

5.0

5.9

"Rob"

"Alyssa"

"Jared"

" Stef"

" Steve" 4.0

4.6

5.0

5.9

"Alyssa"

" Stef "

" Steve"

70

4.0

4.6

5.0

5.9

"Rob"

"Alyssa"

"Jared"

" Stef"

" Steve" 4.0

4.6

5.0

5.9

"Alyssa"

"Stef"

" Steve"

"Rob"

§ 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

73

Korrekte Umkehrabbildung§ Jede Note muss auf eine Sammlung (Collection) von

Assistenten abgebildet werden.

Map<Double, Set<String>> note = new HashMap<Double, Set<String>>();

74

Korrekte UmkehrabbildungMap<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]

77

78

79

80

81

82

83

84

85

86

Korrekte UmkehrabbildungMap<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. 87

Übung

1. Schreiben Sie ein Programm, das zählt wievieleverschiedene Wörter in einem Text auftauchen.§ Speichern Sie die Wörter in einer (An)Sammlung und halten Sie fest

wie oft ein Wort in dem Text auftritt. § Nach dem Einlesen des Textes sollte es möglich sein, festzustellen

wie oft ein bestimmtes Wort im Text auftritt.

2. Geben Sie jedes Wort das mindestens 1000mal auftritt aus(a) und entfernen es aus der Menge (b)

88

Lösung der 1. Übungsaufgabe// 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);

}

} 89

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

90

Übung (Fortsetzung)

1. Geben Sie jedes Wort das mindestens 1000mal auftritt aus(a) und entfernen es aus der Menge (b)

§ Wie finden wir diese Wörter?§ Wie können wir alle Wörter besuchen (dann können wir abfragen

wie oft das Wort aufgetreten ist)?

91

Übung (Fortsetzung)

1. Geben Sie jedes Wort das mindestens 1000mal auftritt aus(a) und entfernen es aus der Menge (b)

§ Wie finden wir diese Wörter?§ Wie können wir alle Wörter besuchen (dann können wir abfragen

wie oft das Wort aufgetreten ist)?Set<String> inText = wordCount.keySet();for (String s : inText) {if ((wordCount.get(s) > 999) { .. .. ..

92

10.6 Iteratoren

93

Mit den Elementen einer Menge (Set) arbeiten

§ Iteration über alle Elemente einer Menge:Set<Double> scores = newHashSet<Double>();for (Double score : scores) {String msg = "The score is " + score;System.out.println(msg);

}

§ HashSet und TreeSet bearbeiten Elemente (evtl) in unterschiedlicher Reihenfolge

§ Bei Abbildungen (Map) liefert keySet() oder values() eine Menge 96

Lösungsversuch (Teil 2)

§ Finden, dann entfernen aller Wörter, die mehr als 999 mal auftreten:Set<String> inText = wordCount.keySet();for (String s : inText) {if ((wordCount.get(s) > 999) {wordCount.remove(s);

}§ Leider tritt während der Ausführung (wenn es Wörter gibt die

> 999 auftreten) eine Exception auf

§ Problem: Die "for each" Schleife ist "read-only", d.h. die Menge darf nicht modifiziert werden während der Loop ausgeführt wird.

97

Exception in thread "main" java.util.ConcurrentModificationExceptionat java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1493)at java.base/java.util.HashMap$KeyIterator.next(HashMap.java:1516)at Example2a.main(Example2a.java:35)

98

Iteratoren§ Anderer Weg eine Iteration zu kontrollieren§ Iterator ("iterator"): Ein Objekt das einem Klienten erlaubt,

die Elemente einer Ansammlung zu besuchen§ Erinnert sich an die (aktuelle) Position and erlaubt es

§ auf das Element an dieser Position zuzugreifen§ das Element an dieser Position zu entfernen§ abzufragen ob es weitere Elemente gibt§ zur nächsten Position vorzurücken

101

103

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

20 0 0 0

size 6

list

iterator Aktuelles Element: 9Aktueller Index: 2Aktuelles Element: 9Nächster Index: 3

104

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

20 0 0 0

size 6

list

Aktuelles Element: 7Nächster Index: 4iterator

105

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

20 0 0 0

size 6

list

set"the"

"to""from"

"we"

Aktuelles Element: "from"Nächstes Element: "the"iterator

"a"

Aktuelles Element: 7Nächster Index: 4iterator

106

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

20 0 0 0

size 6

list

set"the"

"to""from"

"we""a"

"a""to""from""the""we"

MöglicheReihenfolge

iterator Aktuelles Element: "from"Nächstes Element: "the"

Aktuelles Element: 7Nächster Index: 4iterator

107

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

20 0 0 0

size 6

list

set"the"

"to""from"

"we""a"

"from""the""to""we""a"iterator

Andere möglicheReihenfolge

Aktuelles Element: "from"Nächstes Element: "the"

Aktuelles Element: 7Nächster Index: 4iterator

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

108

109

set"the"

"to""from"

"we""a"

"from""the""to""we""a"

current next hasNext"from" "the" true"the" "to" true"to" "we" true"we" "a" true"a" false

iterator Aktuelles Element: "from"Nächstes Element: "the"

110

Iterator Beispiel 1

Set<Integer> scores = new TreeSet<Integer>();

scores.add(94); // Lisascores.add(38); // Kimscores.add(87); // Royscores.add(43); // Martyscores.add(72); // Marisa

111

Iterator Beispiel 1 (Teil 2)

Iterator<Integer> itr = scores.iterator();System.out.println(scores); // [38, 43, 72, 87, 94]

while (itr.hasNext()) {int score = itr.next();

// eliminate any failing gradesif (score < 60) {

itr.remove();}

}System.out.println(scores); // [72, 87, 94]

112

Iterator Beispiel 2Map<String, Integer> scores;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);

115

Iterator Beispiel 2Map<String, Integer> scores;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);

38

43

72

87

94

"Marisa"

"Kim"

"Lisa"

"Marty"

"Roy"

116

Iterator Beispiel 2

38

43

72

87

94

"Marisa"

"Kim"

"Lisa"

"Marty"

"Roy"

scores.keyset():

[Kim, Lisa, Marisa, Marty, Roy] 117

Iterator Beispiel 2 (Teil 2)Iterator<String> itr = scores.keySet().iterator();System.out.println(scores.keySet()); // [Kim, Lisa, Marisa, Marty, Roy]

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

Iterator Beispiel 2 (Output)

[Kim, Lisa, Marisa, Marty, Roy]

Kim got 38

Lisa got 94

Marisa got 72

Marty got 43

Roy got 87

// nach Entfernen der Personen mit score < 60

{Lisa=94, Marisa=72, Roy=87}121

Iterator Beispiel 2 – HashMap Variation

scores = new HashMap<String, Integer>();

Gleiches Resultat aber andere Reihenfolge der Iteration

[Marisa, Marty, Roy, Kim, Lisa]Marisa got 72Marty got 43Roy got 87Kim got 38Lisa got 94

// nach Entfernen der Personen mit score < 60{Marisa=72, Roy=87, Lisa=94

122

Nett (?) wäre ….while (itr.hasNext()) {

String name = itr.next();

int score = scores.get(name);

System.out.println(name + " got " + score);

// raise any failing students

if (score < 60) {

scores.replace(name, 60);

}

}123

Unfair (?) wäre ….while (itr.hasNext()) {

String name = itr.next();

int score = scores.get(name);

System.out.println(name + " got " + score);

// raise any failing students

if (score < 60) {

scores.put(name, 60);

}

}124

Nicht möglich wäre ….while (itr.hasNext()) {

String name = itr.next();

int score = scores.get(name);

System.out.println(name + " got " + score);

// raise any failing students

if (score < 60) {

scores.put("* " + name, 60);

}

}125

Ergibt wieder Laufzeitfehlerda es keinen Eintrag fürdiesen (neuen) Namen gibt!

Zusammenfassung Iterator§ Iterator entkoppelt Abarbeiten/Besucher der Elemente einer

Ansammlung von den Details der Darstellung§ Klient muss nicht geändert werden wenn sich die Darstellung ändert

§ Iterator erlaubt Entfernen eines Elements in der Schleife§ Siehe Beispiel 2

127

252-0027Einführung in die Programmierung

Stil und KonventionenTeil 2

Thomas R. Gross

Department InformatikETH Zürich

Layout -- Wiederholung§ Nicht mehr als 100 Zeichen pro Zeile

§ Neue Zeile für jede Anweisung§ Keine unnötigen neuen Zeilen (neue Zeile wenn alte Zeile nicht

ausreicht oder zur Trennung von (unabhängigen) Aktionen)

§ Manche Gruppen empfehlen < 80 Zeichen pro Zeile

129

Layout -- Wiederholung§ Aufeinanderfolgende Anweisungen untereinander

int x = 10;int y = x + 1;

§ Gleich weit eingerückt

§ Jeder neue Block wird eingerückt§ 2, 4, 6 (selten 8) Leerzeichen

130

Beispielif (a == 1) {System.out.println(a);x = 3;b = b + x;} else if (a == 2) {System.out.println(a);x = 6;y = y + 10;b = b + x;} else { // a == 3System.out.println(a);x = 9;b = b + x;}

Beispielif (a == 1) {

System.out.println(a);x = 3;b = b + x;

} else if (a == 2) {System.out.println(a);x = 6;y = y + 10;b = b + x;

} else { // a == 3System.out.println(a);x = 9;b = b + x;

}

Variablennamen

§ Kurze Variablennamen reserviert für Loopcounter§ D.h. i, j, k usw sollten immer Loopcounter sein§ Idealerweise im for Statement deklariert§ for (int i = 0; …; i++) { … }§ for (double d : measuredTemp) { … }

§ Standard Konvention§ MyClass für Typen: Klassen und Interfaces

§ MyClass() ist dann der Konstruktor der Klasse§ myVariable für Attribute, Parameter und Variable (static und local)

§ myMethod() für Methoden§ MY_CONSTANT für Konstanten (sind final) 133

Leerzeichen§ Kosten wenig – können helfen§ Einrücken von Blöcken

§ Trennen Keywords§ for▢(int i = 1; …) oder while▢(true) § for(int i=1; …) oder while(true)

§ Aber§ myMethod(params) oder myMethod()§ myMethod▢(params) oder myMethod▢▢▢()

§ Methodenaufrufe sind so schnell zu erkennen 134

Leerzeichen§ Zuweisungsoperator = mit Leerzeichen abgesetzt§ Keine Leerzeichen nach ( oder vor )

135

NewLines§ Strukturieren ein Programm§ Immer vor/nach Methodendeklaration

§ Gilt auch für Konstruktoren …

§ Eine Anweisung per Zeile§ Anweisungen die eine Gruppe bilden werden durch

NewLines abgegrenzt

136

NewLines§ Schreiben Sie Code der durchsucht werden kann§ new Operator mit Konstruktor auf eine Zeile, ein Leerzeichen

§ Also new▢Foo(parameter) und nichtnewFoo(parameter)

oder new▢▢▢Foo(parameter)§ Lange Ausdrücke: nach Operator trennen

§ und Rest einrücken137

a+b+c+dwenn kein Platza+b+

c+d

Methoden

§ Kurze Programme sind schneller zu lesen

§ Keine Code Duplikation!

§ Methoden erlauben Wiederverwendung

§ In der Regel nicht mehr als 20-40 Anweisungen pro Methode

§ Es gibt manchmal gute Gründe für Ausnahmen

§ (z.B. switch Statement, geschachtelte if-Statements)

§ Wenn es mehr Anweisungen gibt: separate Methode!

138

Sichtbarkeit und Zugriffsrechte§ Methoden sind zuerst private und bleiben private – es

sei denn ein Klient ruft sie auf§ Klassen sind public wenn es Klienten gibt§ Attribute die verändert werden können sind private

§ Zugriff via "getter" und "setter" Methoden§ Flexibel – kann Darstellung (des Attributes) später ändern

139

Methoden§ Kurze Parameterlisten

§ If you have a procedure with ten parameters, you probably missed some. (Alan Perlis Epigrams in Programming)

§ Eine Methode sollte ein Problem/eine Aufgabe lösen

140

§ Kurze Methoden sind schneller zu verstehen

§ Parameter sollten nicht (in der Methode) modifiziert werden

Recommended