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, 2019 All 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
Bemerkungen zu Vorlesung und Prüfung
3
Ende Oktober
5
November
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 nur die 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ährend
der Vorlesung nicht wirklich Zeit hat, einen langen Code genau
Prüfung
§ Was ich weiss:
§ Am 23. 1. 2020
§ Türöffnung 9:00 morgens
§ Programmierprüfung (am Computer) und schriftliche Prü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
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
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 werden kö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.
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 korrekt behandelt 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
Arbeiten mit Set Exemplaren
List<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/Variable
boolean method(Set<String> s)
21
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]"
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
23
Mengen 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]
Mengen 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] 25
∀ 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 (An)Sammlung
§ Menge Spezialfall
Die "for each" Schleife
Syntax:
for (type name : collection) { statements;
}
type: Typ der Elemente der Collection
name: Variable (nur innerhalb des Loops definiert)
§ Definiert einen Loop über alle Elemente einer Ansammlung (z.B., Set, List) die das Interface Collection
implementieren oder eines Arrays
27
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()) {
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));
}
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
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
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"?
"ETH" Set true
false
"ETH" Map "8092"
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"
37
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?
Map get("ETH")
"044-632-1111"
Map // key value
put("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 assoziierten
Wertes)
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 gespeichert
Zugriff sehr effizient: O(1)
§ LinkedHashMap : Zugriff schnell O(1), speichert Elemente in der Reihenfolge in der sie in die Abbildung hinzugefügt wurden
§ TreeMap: Schlüssel in einem binärem Baum gespeichert;
§ 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
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}"
48
Konstruktion von Abbildungen
Map<KeyType, ValueType> name = new TreeMap<KeyType,
ValueType>();
§ Könnte auch auch spezifische Referenzvariable
TreeMap< KeyType, ValueType > name
deklarieren
§ Wollen vielleicht flexibel bleiben
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 Sarah
Typ ist String – daher entscheidet
compareTo der Klasse String die Ordnung
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() Beispiel
Die 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 -> 2
int age = ages.get(name); // Roland -> 19
keySet() Beispiel
Die 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 -> 2 int age = ages.get(name); // Roland -> 19 System.out.println(name + " -> " + age); // Sarah -> 57
}
54put(…) ü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 -> 19values()
§ Die Methode values liefert eine Ansammlung aller in der Map 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 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
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);
... 61
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");
...
66
4.0 4.6 5.0 5.9
"Rob"
"Alyssa"
"Jared"
" Stef"
" Steve" 4.0
4.6 5.0 5.9
" Jared "
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"
4.0 4.6 5.0 5.9
"Rob"
"Alyssa"
"Jared"
" Stef"
" Steve" 4.0
4.6
5.0 "Alyssa"
" Stef "
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
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 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? " +
78
80
82
84
86
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]
Übung
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 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);
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)?
Ü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
Mit den Elementen einer Menge (Set) arbeiten
§ Iteration über alle Elemente einer Menge:
Set<Double> scores = new HashSet<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
96Lö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
Exception in thread "main"
java.util.ConcurrentModificationException
at java.base/java.util.HashMap$HashIterator.nextNode(Has hMap.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
103
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
iterator Aktuelles Element: 9 Aktueller Index: 2 Aktuelles Element: 9 Nächster Index: 3
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
Aktuelles Element: 7 Nächster Index: 4 iterator
105
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
set
"the"
"to"
"from"
"we"
Aktuelles Element: "from"
Nächstes Element: "the"
iterator
"a"
Aktuelles Element: 7 Nächster Index: 4 iterator
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
set
"the"
"to"
"from"
"we"
"a"
"a"
"to"
"from"
"the"
Mögliche Reihenfolge
Aktuelles Element: "from"
Aktuelles Element: 7 Nächster Index: 4 iterator
107
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
set
"the"
"to"
"from"
"we"
"a"
"from"
"the"
"to"
"we"
"a"
iterator
Andere mögliche Reihenfolge
Aktuelles Element: "from"
Nächstes Element: "the"
Aktuelles Element: 7 Nächster Index: 4 iterator
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>();
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)
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"
Iterator Beispiel 1
Set<Integer> scores = new TreeSet<Integer>();
scores.add(94); // Lisa scores.add(38); // Kim scores.add(87); // Roy scores.add(43); // Marty scores.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 grades if (score < 60) {
itr.remove();
}
}
Iterator Beispiel 2
Map<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 2
Map<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
"Marisa"
"Kim"
"Lisa"
"Roy"
Iterator Beispiel 2
38 43 72 87 94
"Marisa"
"Kim"
"Lisa"
"Marty"
"Roy"
scores.keyset():
[Kim, Lisa, Marisa, Marty, Roy]
117Iterator 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
}
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 72 Marty got 43 Roy got 87 Kim got 38 Lisa got 94
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);
}
}
123Unfair (?) 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);
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);
}
}
125Ergibt wieder Laufzeitfehler da es keinen Eintrag für
diesen (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
252-0027
Einführung in die Programmierung
Stil und Konventionen
Teil 2
Thomas R. Gross
Department Informatik
ETH 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
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
Beispiel
if (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 == 3
System.out.println(a);
x = 9;
Beispiel
if (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 == 3
System.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)
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
134Leerzeichen
§ Zuweisungsoperator = mit Leerzeichen abgesetzt
§ Keine Leerzeichen nach ( oder vor )
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 nicht new
Foo(parameter)
oder new ▢▢▢ Foo(parameter)
§ Lange Ausdrücke: nach Operator trennen a+b+c+d
wenn kein PlatzMethoden
§ 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
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