• 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!
113
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, 2019 All rights reserved.

(2)

Übersicht

§ 10.1 Einleitung

§ 10.2 ArrayList<T>

§ ArrayList<String>

§ Wrapper Typen

§ 10.3 Vergleichen von Objekten

§ 10.4 Mengen

§ 10.5 Abbildungen

(3)

Bemerkungen zu Vorlesung und Prüfung

3

(4)

Ende Oktober

(5)

5

November

(6)

Ende Oktober

(7)

7

(8)

§ 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

(9)

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.

(10)

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

(11)

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

(12)

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

(13)

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

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

(16)

Übersicht

§ 10.1 Einleitung

§ 10.2 ArrayList<T>

§ ArrayList<String>

§ Wrapper Typen

§ 10.3 Vergleichen von Objekten

§ 10.4 Mengen

§ 10.5 Abbildungen

(17)

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

(18)

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

(19)

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

(20)

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]

(21)

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

(22)

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

(23)

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

(24)

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

(25)

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

}

(26)
(27)

Reihenfolge der Iteration

§ HashSet – nicht definiert.

§ LinkedHashSet – wie eingefügt.

§ ArrayList – wie eingefügt.

§ LinkedList – wie eingefügt.

§ TreeSet – aufsteigend (nach compareTo).

32

(28)

10.5 Abbildungen

(29)

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

(30)

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"

(31)

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

(32)
(33)

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

(34)

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)

(35)

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

(36)

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;

(37)

§ 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

(38)
(39)

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

(40)

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

(41)

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

(42)
(43)

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

(44)

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

(45)

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

}

54

(46)

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

int age = ages.get(name);

// Roland -> 19

(47)

values()

§ 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

(48)

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

(49)

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

(50)

4.0 4.6 5.0 5.9

"Rob"

"Alyssa"

"Jared"

" Stef"

" Steve"

(51)

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

(52)

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

...

(53)

66

4.0 4.6 5.0 5.9

"Rob"

"Alyssa"

"Jared"

" Stef"

" Steve" 4.0

4.6 5.0 5.9

" Jared "

(54)

4.0 4.6 5.0 5.9

"Rob"

"Alyssa"

"Jared"

" Stef"

" Steve" 4.0

4.6

5.0 "Alyssa"

" Jared "

(55)

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"

(56)

4.0 4.6 5.0 5.9

"Rob"

"Alyssa"

"Jared"

" Stef"

" Steve" 4.0

4.6

5.0 "Alyssa"

" Stef "

(57)

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"

(58)

§ 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

(59)

Korrekte Umkehrabbildung

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

Map<Double, Set<String>> note =

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

74

(60)

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

(61)

78

(62)
(63)

80

(64)
(65)

82

(66)
(67)

84

(68)
(69)

86

(70)

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]

(71)

Ü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

(72)

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

(73)

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

(74)

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

(75)

Ü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

(76)

10.6 Iteratoren

(77)

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

96

(78)

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

(79)

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

(80)

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

(81)

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

(82)

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

(83)

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

(84)

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

(85)

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

(86)

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)

(87)

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"

(88)
(89)

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

(90)

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

}

}

(91)

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

(92)

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"

(93)

Iterator Beispiel 2

38 43 72 87 94

"Marisa"

"Kim"

"Lisa"

"Marty"

"Roy"

scores.keyset():

[Kim, Lisa, Marisa, Marty, Roy]

117

(94)

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

}

(95)

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

(96)

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

(97)

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

(98)

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

(99)

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 Laufzeitfehler da es keinen Eintrag für

diesen (neuen) Namen gibt!

(100)

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

(101)

252-0027

Einführung in die Programmierung

Stil und Konventionen

Teil 2

Thomas R. Gross

Department Informatik

ETH Zürich

(102)

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

(103)

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

(104)

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;

(105)

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;

}

(106)

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)

(107)

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

(108)

Leerzeichen

§ Zuweisungsoperator = mit Leerzeichen abgesetzt

§ Keine Leerzeichen nach ( oder vor )

(109)

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

(110)

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 Platz

(111)

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

(112)

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

(113)

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

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