252-0027
Einführung in die Programmierung 9.0 Generische Programmierung
Thomas R. Gross
Department Informatik ETH Zürich
Copyright (c) Pearson 2013 and Thomas Gross 2016
All rights reserved. 1
Übersicht
§ 9.1 Einleitung
§ 9.2 ArrayList<T>
§ ArrayList<String>
§ Wrapper Typen
§ 9.3 Vergleichen von Objekten
§ 9.4 Mengen
§ 9.5 Abbildungen
3
9.2 Zusammenfassung/Wiederholung
4
ArrayList
§ Type in ArrayList<Type> muss ein Referenztyp sein
§ … Type kann nicht ein Basistyp sein
§ Wrapper Types: int: Integer, double:Double, boolean:Boolean, ….
§ Referenztypen die einen Wert des entsprechenden Basistyps
enthalten
9
Integer Parameter
§ Was gibt dieses Programm(segment) aus?
Integer bi = new Integer(777);
test(bi);
System.out.println(bi);
---
public static void test(Integer bigI) { System.out.println(bigI);
Integer someI;
someI = 333;
System.out.println(someI);
bigI = new Integer(666);
System.out.println(bigI);
} 10
777 333
666
777
Legale und Illegale Indize
§ Gegeben sei
ArrayList<String> allWords = new ArrayList<String>();
§ Der Index für einen Zugriff auf ein Element der Liste (z.B.
allWords.get(i) ) muss zwischen 0 und der Grösse der Liste - 1 liegen (einschliesslich)
§ 0 <= index <= allWords.size() - 1.
§ Ein Zugriff auf ein Element ausserhalb dieses Bereichs hat eine
IndexOutOfBoundsException zur Folge.
ArrayList<String> names = new ArrayList<String>();
names.add(”Bob");
names.add(”Pete");
names.add(”Vicki");
names.add(”Sue");
System.out.println(names.get(0)); // okay System.out.println(names.get(3)); // okay
System.out.println(names.get(-1)); // exception names.add(9, "Aimee"); // exception
13
index 0 1 2 3
value Bob Pete Vicki Sue
ArrayList ”Rätsel"
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 1; i <= 10; i++) {
list.add(10 * i); // [10, 20, 30, 40, ..., 100]
}
§ Was gibt dieses Programmsegment aus?
for (int i = 0; i < list.size(); i++) { list.remove(i);
}
System.out.println(list);
ArrayList ”Rätsel"
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 1; i <= 10; i++) {
list.add(10 * i); // [10, 20, 30, 40, ..., 100]
}
§ Was gibt dieses Programmsegment aus?
for (int i = 0; i < list.size(); i++) { list.remove(i);
}
System.out.println(list);
§ Answer: [20, 40, 60, 80, 100]
18
ArrayList ”Rätsel" 2
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 1; i <= 5; i++) {
list.add(2 * i); // [2, 4, 6, 8, 10]
}
§ Was gibt dieses Programmsegment aus?
int size = list.size();
for (int i = 0; i < size; i++) {
list.add(i, 42); // add 42 at index i }
System.out.println(list);
21
ArrayList ”Rätsel" 2
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 1; i <= 5; i++) {
list.add(2 * i); // [2, 4, 6, 8, 10]
}
§ Was gibt dieses Programmsegment aus?
int size = list.size();
for (int i = 0; i < size; i++) {
list.add(i, 42); // add 42 at index i }
System.out.println(list);
§ Answer: [42, 42, 42, 42, 42, 2, 4, 6, 8, 10]
ArrayList ”Rätsel" 3
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 1; i <= 5; i++) {
list.add(2 * i); // [2, 4, 6, 8, 10]
}
§ Was gibt dieses Programmsegment aus?
for (int i = 0; i < list.size(); i++) {
list.add(i, 777); // add 777 at index i }
System.out.println(list);
Übung
§ Schreiben Sie ein Programm das eine Datei mit ganzen Zahlen liest und dann die Zahlen als Liste druckt:
§ Dann drucken Sie den Durchschnitt der Zahlen.
§ Geben Sie die grösste und die kleinste Zahl aus.
§ Filtern (d.h. entfernen) Sie alle geraden Zahlen (Zahlen die durch 2
ohne Rest teilbar sind).
ArrayList Methoden
add(value) appends value at end of list
add(index, value) inserts given value just before the given index, shifting subsequent values to the right
clear() removes all elements of the list
indexOf(value) returns first index where given value is found in list (-1 if not found)
get(index) returns the value at given index
remove(index) removes/returns value at given index, shifting subsequent values to the left
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 "[3, 42, -7, 15]"
Lösung (Auszug)
ArrayList<Integer> numbers = new ArrayList<Integer>();
Scanner input = new Scanner(new File("numbers.txt"));
while (input.hasNextInt()) { int n = input.nextInt();
numbers.add(n);
}
System.out.println(numbers);
filterEvens(numbers); // Remove even numbers System.out.println(numbers);
...
Lösung (Auszug)
ArrayList<Integer> numbers = new ArrayList<Integer>();
Scanner input = new Scanner(new File("numbers.txt"));
while (input.hasNextInt()) { int n = input.nextInt();
numbers.add(n);
}
System.out.println(numbers);
filterEvens(numbers);
System.out.println(numbers);
...
Lösung (Auszug)
// Removes all elements w/ even values from the list.
public static void filterEvens(ArrayList<Integer> list) { for (int i = list.size() - 1; i >= 0; i--) {
int n = list.get(i);
if (n % 2 == 0) { list.remove(i);
} }
}
31
32
Übung
§ Schreiben Sie eine Methode addStars die eine ArrayList von Strings als Parameter hat und einen “ *” nach jedem Element einfügt.
§ Beispiel : Wenn die ArrayList list am Anfang enthält:
[die, schnelle, graue, Schlange]
§ Dann ist der Effekt des Aufrufs addStars(list) diese Liste:
[die, *, schnelle, *, graue, *, Schlange, *]
§ Schreiben Sie eine Methode removeStars die eine
ArrayList von Strings als Parameter hat in der jedes zweite Element ein “ * ” ist, und entfernen Sie diese Sterne (machen also den Effekt der Methode addStars rückgängig).
34
Lösungen
public static void addStars(ArrayList<String> list) { for (int i = 0; i < list.size(); i += 2) {
list.add(i+1, "*");
} }
public static void removeStars(ArrayList<String> list) { for (int i = 1; i < list.size(); i++) {
list.remove(i);
}
}
Übung
§ Schreiben Sie eine Methode intersect die zwei ArrayListen mit ganzen Zahlen als Parameter akzeptiert und eine neue ArrayList zurückgibt, die nur die Elemente enthält, die in beiden Listen vorhanden sind.
§ Beispiel: Wenn list1 und list2 ursprünglich enthalten:
[1, 4, 8, 9, 11, 15, 17, 28, 41, 59]
[4, 7, 11, 17, 19, 20, 23, 28, 37, 59, 81]
§ dann ergibt der Aufruf von intersect(list1, list2) die Liste:
[4, 11, 17, 28, 59]
Lösung (Teil 1)
ArrayList<Integer> list1 = new ArrayList<Integer>();
Scanner input = new Scanner(new File("list1.txt"));
while (input.hasNext()) {
int i = input.nextInt();
list1.add(i);
}
ArrayList<Integer> list2 = new ArrayList<Integer>();
input = new Scanner(new File("list2.txt"));
while (input.hasNext()) {
int i = input.nextInt();
list2.add(i);
}
38Lösung (Teil 2)
ArrayList<Integer> list3 = new ArrayList<Integer>();
list3.addAll(list1);
list3.retainAll(list2);
System.out.println(list3);
39
Andere Übungen
§ Schreiben Sie eine Methode reverse die die Reihenfolge der Elemente einer ArrayList für Strings umkehrt.
§ Schreiben Sie eine Methode capitalizeAdverbs die als Parameter eine ArrayList von String Objekten entgegen nimmt und jedes Wort eines englischen Textes, das mit “ly"
endet, mit Grossbuchstaben schreibt.
Collections als Attribut von Objekten
§ Ein Objekt kann einen Array, eine ArrayList, oder jede beliebige Sammlung als Attribut haben.
public class Course {
private String[] locations;
private ArrayList<String> studentNames;
private ArrayList<Double> studentGrades;
public Course() {
locations = new String[5];
studentNames = new ArrayList<String>();
} ...
§ Jedes Exemplar enthält jetzt zwei Collection Objekte.
9.3 Vergleichen von Objekten
42
Die compareTo Methode
§ Um das Vergleichen von Exemplaren zu ermöglichen sollte eine Java Klasse eine Methode compareTo definieren, die auf der Menge der Exemplare eine (totale) Ordnungs- relation ≤ definiert
§ Diese erlaubt es dann zwei Exemplare zu vergleichen.
§ A ≤ B oder B ≤ A
§ A ≤ B und B ≤ A: A = B
§ Beispiel: in der String Klasse gibt es die Methode
public int compareTo(String other)
compareTo für String
§ Beispiel: in der String Klasse gibt es die Methode
public int compareTo(String other)
§ Ein Aufruf someS .compareTo( otherS ) liefert:
einen Wert < 0 wenn someS ”vor" otherS in der Ordnungsrelation ist, einen Wert > 0 wenn someS ”nach" otherS in der Ordnungsrelation ist, oder 0 wenn someS und otherS in der Ordnungsrelation
”gleich" sind
44
45
Gebrauch von compareTo
§ compareTo kann im Test einer if Anweisung gebraucht werden.
String a = "alice";
String b = "bob";
if (a.compareTo(b) < 0) { // true ...
}
47
Gebrauch von compareTo
Primitives Objects
if (a < b) { ... if (a.compareTo(b) < 0) { ...
if (a <= b) { ... if (a.compareTo(b) <= 0) { ...
if (a == b) { ... if (a.compareTo(b) == 0) { ...
if (a != b) { ... if (a.compareTo(b) != 0) { ...
if (a >= b) { ... if (a.compareTo(b) >= 0) { ...
if (a > b) { ... if (a.compareTo(b) > 0) { ...
compareTo und Collections
§ Die Methode für binäre Suche ( binarySearch ) funktioniert für die Klasse Arrays da diese Methode (intern) die
compareTo Methode aufruft.
String[] a = {"al", "bob", "cari", "dan", "mike"};
int index = Arrays.binarySearch(a, "dan"); // 3
§ Auch sortieren ist deswegen möglich
String [] s = {"my", "dog", "has", "fleas"};
Arrays.sort(s);
System.out.println(Arrays.toString(s));
§ Output: [dog, fleas, has, my]
49
This sort is guaranteed to be stable: equal elements will not be reordered as a result of the sort.
Implementation note: This implementation is a stable, adaptive, iterative mergesort that requires far
fewer than n lg(n) comparisons when the input array is partially sorted, while offering the performance of a traditional mergesort when the input array is randomly ordered. If the input array is nearly sorted, the implementation requires approximately n comparisons. Temporary storage requirements vary from a small constant for nearly sorted input arrays to n/2 object references for randomly ordered input arrays.
§ Arrays hilft bei Arrays mit beliebigen Objekten. Aber wie können wir mit einer ArrayList arbeiten?
§ Wie die Klasse Arrays gibt es auch eine Klasse Collections die nützliche Methoden für Collections enthält
§ zum Beispiel sort
§ Wir müssen 2 Fälle unterscheiden:
§ Die (Klasse der) Elemente der ArrayList enthält automatisch compareTo
§ Die Klasse enthält compareTo nicht automatisch
50§ Fall 1: Die Elemente der ArrayList stellen compareTo automatisch zur Verfügung
ArrayList<String> list = new ArrayList<String>();
String [] s = {"my", "dog", "has", "fleas"};
for (int i = 0; i < s.length; i++) list.add(new String(s[i]));
Collections.sort(list);
System.out.println(list1);
§ Output:
[dog, fleas, has, my]
51
§ Wie können wir mit einer ArrayList mit beliebigen Objekten arbeiten?
§ Fall 2: Selbstdefinierte Klassen, stellen compareTo nicht automatisch zur Verfügung
Beispiel: Wir halten zu jedem Wort die Position des ersten Auftretens in einem Text fest
public class Word { String item;
int position;
int count;
Word(String n) { item = n;
} }
52§ Wie können wir mit einer ArrayList mit beliebigen Objekten arbeiten?
§ Fall 2: Selbstdefinierte Klassen
String [] s = {"my", "dog", "has", "fleas"};
ArrayList<Word> list1 = new ArrayList<Word>();
for (int i=0; i<s.length; i++) { list1.add(new Word(s[i]));
}
Collections.sort(list1);
54
Sieht gut aus, aber wird nicht übersetzt
//javac Example7aa.java
Example7aa.java:15: cannot find symbol
symbol : method sort(java.util.ArrayList<Word>) location: class java.util.Collections
Collections.sort(list1);
^ 1 error
55
Selbstdefinierte Typen ordnen
§ Wir können eine beliebige ArrayList nicht sortieren da Java nicht weiss, wie die Elemente zu ordnen sind.
§ Unsere Klasse ( Word ) muss klar machen, wie die Elemente geordnet sind
§ Dafür gibt es ein Interface das compareTo enthält
58
Comparable
§ Ein Aufruf someE .compareTo( otherE ) liefert:
einen Wert < 0 wenn someE ”vor" otherE in der Ordnungsrelation ist, einen Wert > 0 wenn someE ”nach" otherE in der Ordnungsrelation ist, oder 0 wenn someE und otherE in der Ordnungsrelation
”gleich" sind
59
Comparable Muster
public class name implements Comparable<name> { ...
public int compareTo(name other) { ...
}
}
Comparable Beispiel
class Word implements Comparable<Word> { String item;
int position;
int count;
… //constructor(s)
public int compareTo(Word otherword) { String compareItem = otherword.item;
return (item.compareTo(compareItem));
}
}
61Comparable Beispiel
§ Was wenn wir jetzt die Exemplare auch nach der Position oder der Häufigkeit ordnen wollen?
§ Dann hätten wir drei mögliche Ordnungsrelationen 1. Lexikographisch auf Grund des Namens
2. Nach Häufigkeit
3. Nach der Position des 1. Auftretens
§ Geht auch aber dazu müssen wir ein besonderes Objekt konstruieren, einen Comparator<T>
§ Später
63compareTo und Collections
§ Auch andere Collections nutzen diese Methode.
§ Java's TreeSet/Map braucht intern compareTo um eine Ordnung zu definieren
Set<String> set = new TreeSet<String>();
for (String s : a) { set.add(s);
}
System.out.println(s);
// [al, bob, cari, dan, mike]
Aufgabe
§ Sie erinnern sich an die Klasse Point
65
Klasse Point
public class Point { private int x;
private int y;
// Constructs a Point at the given x/y location.
public Point(int initialX, int initialY) { x = initialX;
y = initialY;
}
// Methods ...
}
Aufgabe
§ Sie erinnern sich an die Klasse Point
§ Wir wollen die Point Exemplare sortieren können
§ Das X Attribut entscheidet, ob ein Point vor einem anderen ist, und wenn die X Attribute gleich sind, dann entscheidet das Y Attribut
67
Aufgabe
§ Sie erinnern sich an die Klasse Point
§ Wir wollen die Point Exemplare sortieren
§ point1 "vor" point2 wenn
§ point1.x < point2.x oder
§ point1.x == point2.x und point1.y < point2.y
§ point1 "nach" point2 wenn
§ point1.x > point2.x oder
§ point1.x == point2.x und point1.y > point2.y
§ sonst point1 "gleich" point2
68compareTo für Point
§ Ein Aufruf A .compareTo( B ) liefert:
einen Wert < 0 wenn A ”vor" B in der Ordnungsrelation ist, einen Wert > 0 wenn A ”nach" B in der Ordnungsrelation ist,
oder 0 wenn A und B in der Ordnungsrelation ”gleich" sind
69
Comparable Beispiel
public class Point implements Comparable<Point> { private int x;
private int y;
}
Comparable Beispiel
public class Point implements Comparable<Point> { private int x;
private int y;
}
Comparable für Point
// sort by x and break ties by y
public int compareTo(Point other) { if (x < other.x) {
return -1;
} else if (x > other.x) { return 1;
} else if (y < other.y) {
return -1; // same x, smaller y } else if (y > other.y) {
return 1; // same x, larger y } else {
return 0; // same x and same y }
}
compareTo Diskussion
§ Subtraktion – Manchmal kann man durch Subtraktion
entsprechender Werte den für compareTo gewünschten Rückgabewert erhalten:
// sort by x and break ties by y
public int compareTo(Point other) { if (x != other.x) {
return x - other.x; // different x } else {
return y - other.y; // same x; compare y }
}
compareTo Diskussion
§ Subtraktion – Manchmal kann man durch Subtraktion
entsprechender Werte den für compareTo gewünschten Rückgabewert erhalten:
§ Die Idee:
§ if x > other.x, then x - other.x > 0
§ if x < other.x, then x - other.x < 0
§ if x == other.x, then x - other.x == 0
§ Achtung: Dieser Weg funktioniert nicht für reelle Zahlen (doubles)
aber siehe Math.signum(double)
compareTo Diskussion
§ toString - Wenn die toString Darstellung der Exemplare der Ordnungsrelation entspricht, dann können wir so vergleichen:
// sort by date, e.g. "09/19" > "04/01"
public int compareTo(Date other) {
return toString().compareTo(other.toString());
}
§ Delegation – Wenn die Exemplare Attribute haben, die verglichen werden können (z.B. Strings) dann kann man deren compareTo Methode verwenden :
// sort by employee name, e.g. "Jim" < "Susan"
public int compareTo(Employee other) {
return name.compareTo(other.getName());
}
Übersicht
§ 9.4 Mengen
§ 9.5 Abbildungen
76
9.4 Mengen
77
Java Collections
Übung
§ Schreiben Sie ein Programm, das zählt wie viele
verschiedene Wörter in einem Text auftauchen (z.B., Tolstois
“Krieg und Frieden” [Война и мир] oder Goethes “Faust”).
§ Speichern Sie die Wörter in einer (An)Sammlung und geben Sie die Anzahl der aufgetretenen Wörter aus.
§ Sind “[das] Gute”, “gute”, “gut”, “guter”, “guten” verschieden?
§ Nach dem Einlesen des Textes sollte es möglich sein, festzustellen ob
ein bestimmtes Wort im Text auftritt.
Sammlungen
§ Was für eine Collection ist die beste für dieses Problem?
§ Wie kann man diese Frage beantworten? Was müssen wir wissen?
81
85
LinkedList Methoden
add(value) appends value at end of list
add(index, value) inserts given value just before the given index, shifting subsequent values to the right
clear() removes all elements of the list
indexOf(value) returns first index where given value is found in list (-1 if not found)
get(index) returns the value at given index
remove(index) removes/returns value at given index, shifting subsequent values to the left
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 "[3, 42, -7, 15]"
Kommt uns diese Liste bekannt vor?
§ Die selben Methoden sind für ArrayList definiert.
88
ArrayList Methoden
add(value) appends value at end of list
add(index, value) inserts given value just before the given index, shifting subsequent values to the right
clear() removes all elements of the list
indexOf(value) returns first index where given value is found in list (-1 if not found)
get(index) returns the value at given index
remove(index) removes/returns value at given index, shifting subsequent values to the left
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 "[3, 42, -7, 15]"
Das Kleingedruckte
§ LinkedList : get(index) braucht O(n) Zeit
§ ArrayList : get(index) braucht O(1) Zeit
90
All of the operations perform as could be expected for a doubly-linked list.
Operations that index into the list will traverse the list from the beginning or the end, whichever is closer to the specified index.
The size, isEmpty, get, [and] set [..] operations run in constant time. The add operation runs in amortized constant time, that is, adding n elements
requires O(n) time. All of the other operations run in linear time (roughly
speaking). The constant factor is low compared to that for the LinkedList
implementation.
Praktische Analyse
§ Müssen das Laufzeitverhalten für realistischen Input messen
§ Was ist “realistischer” Input?
§ Zeitmessungen nicht einfach
§ Java System hat viele Komponenten (einige haben wir noch garnicht kennengelernt) und verschiedene Compiler
§ Einfache Messung gibt uns “end-to-end” Übersicht
§ System.currentTimeMillis()
§ Eingebaut
91
System.currentTimeMillis()
§ Gibt die Zeit (in ms) seit 00:00 , 1. Januar 1970.
§ Typ des Rückgabewertes ist long
§ Ein anderer Basistyp
§ Wie int nur mit einer Darstellung die mehr Bits (64) erfordert
§ Kann wiederholt aufgerufen werden um die Ausführungszeit einer (genügend lange laufenden) Methode zu messen
92
Beispiel – Lösung für Übung
§ Input: Thomas Mann, Die Buddenbrooks, 1'602'177 Bytes
§ Quelle: Projekt Guttenberg
§ Messungen
95
Klasse Zeit (ms)
LinkedList 662
ArrayList 615
Beispiel
§ Input: Thomas Mann, Die Buddenbrooks, 1'602'177 Bytes
§ Quelle: Projekt Guttenberg
§ Lesen der Datei, Einfügen in Collection
§ Intel(R) Xeon(R) CPU E5-4640 0 @ 2.40GHz, OpenJDK (1.8.0_161-b14)
96Klasse Zeit (ms)
LinkedList 662
ArrayList 615
§ Ernsthafte Evaluationen müssen viele Aspekte berücksichtigen
§ Mehrfache Ausführung des selben Programms
§ Durchschnitt (arithmetisch, harmonisch, geometrisch)
§ k-out-of-N
§ Prozessoren sind komplex
§ Speicher Hierarchie
§ Echte Clock Rate
§ Java Umgebung ist komplex
97Messungen
§ ArrayList (ms): 593, 702, 606, 582, 594
§ LinkedList (ms): 696, 610, 676, 632, 694
98
Messungen
§ Input: Thomas Mann, Die Buddenbrooks, 236'239 Wörter
§ Iteration, arbeiten mit jedem 10. Wort
§ Intel(R) Xeon(R) CPU E5-4640 0 @ 2.40GHz, OpenJDK (1.8.0_161-b14)
99
Klasse Zeit (ms)
LinkedList 20'272
ArrayList 2
Messungen
§ Input: Thomas Mann, Die Buddenbrooks, 236'239 Wörter
§ Iteration arbeiten mit jedem Wort
§ Intel(R) Xeon(R) CPU E5-4640 0 @ 2.40GHz, OpenJDK (1.8.0_161-b14)
100
Klasse Zeit (ms)
LinkedList 195'279
ArrayList 24
101
252-0027
Einführung in die Programmierung
Stil und Konventionen
Teil 1
Thomas R. Gross
Department Informatik ETH Zürich
102
Übersicht
§ Einfache Regeln
§ Setzen Eclipse voraus
103
Code
104
Faktorisierung
§ Sie erinnern sich an die Zerlegung einer Zahl in Primzahlen
§ Oder die Zerlegung von Polynomen
§ Faktorisierung
§ Idee: keine Überlappung
§ Faktorisierung (factoring) von Code : Herausarbeiten von gemeinsamen/redundanten Anweisungen
§ In der Praxis of Refaktorisierung (refactoring)
105
Faktorisierung für if/else Anweisungen
§ Example:
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;
}
System.out.println(a);
b = b + x;
106
Faktorisierung für if/else Anweisungen
§ Example:
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;
}
System.out.println(a);
x = 3 * a;
b = b + x;
107
Faktorisierung für if/else Anweisungen
§ Example:
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;
}
System.out.println(a);
x = 3 * a;
if (a == 2) { y = y + 10;
}
b = b + x;
108
Boolesche Ausdrücke
if (((x>0) && (y>0)) && (z > 0)) { // block 1
}
// more code
if (((x>0) && (y>0)) && (z >= 0)) { // block 2
}
§ Was ist an diesem Code Beispiel schlecht?
109
Boolesche Ausdrücke
if (((x>0) && (y>0)) && (z > 0)) { // block 1
}
// more code
if (((x>0) && (y>0)) && (z >= 0)) { // block 2
}
§ Was ist an diesem Code Beispiel schlecht?
§ (x>0) && (y>0) mehrfach berechnet
110Boolesche Ausdrücke
if (((x>0) && (y>0)) && (z > 0)) { // block 1
} else if (((x>0) && (y>0)) && (z < 0)) { // block 2
} else if (((x>0) && (y>0)) && (z == 0)) { // block 3
}
§ Was ist an diesem Code Beispiel schlecht?
111
Beispiel -- Faktorisierung
if (((x>0) && (y>0))) { if (z > 0) {
// block 1
} else if (z < 0) { // block 2
} else if (z == 0) { // block 3
} }
112
Manchmal kann man if Statements vermeiden
113
Filter --
public static int[] filter (int [] numbers) { int [] filtered = new int[numbers.length];
for (int i = 0; i < numbers.length; i++) { if (numbers[i] < 0) {
filtered[i] = 0;
} else {
filtered[i] = numbers[i];
} }
return filtered;
}
114
C Überbleibsel
§ Der ? Operator ist ein Überbleibsel von C
§ C: Programmiersprache in der UNIX implementiert wurde
(test) ? value1 : value2
§ Wenn test true ergibt, ist das Ergebnis dieses Ausdrucks value1, sonst value2
§ Beispiel: max = (a>b) ? a : b;
§ Nicht so effizient wie man denkt aber kompakt
115
if/else , ? Lösung (Quadrant finden)
public static int quadrant(double x, double y) { if ((x==0) || (y==0))
return 0;
else if (x>0)
return (y>0) ? 1 : 4;
else
return (y>0) ? 2 : 3;
}
116Filter -- kürzer
public static int[] filter (int [] numbers) { int [] filtered = new int[numbers.length];
for (int i = 0; i < numbers.length; i++) {
filtered[i] = (numbers[i] < 0) ? 0 : numbers[i];
}
return filtered;
}
117
Vorsicht bei Array Zugriff, Dereferenzierung
118
Auswertung des Tests
§ Dieser Code führt zu einem Fehler falls ein Array nur ein Element hat.
// tests if array1 and array2 end with the same two ints.
boolean last2Equal;
int a1_len = array1.length;
int a2_len = array2.length;
last2Equal = ((array1[a1_len-1] == array2[a2_len-1]) &&
(array1[a1_len-2] == array2[a2_len-2]));
119
Auswertung des Tests
§ Dieser Code führt zu einem Fehler falls ein Array nur ein Element hat oder garnicht existiert.
// tests if array1 and array2 end with the same two ints.
boolean last2Equal;
int a1_len = array1.length;
int a2_len = array2.length;
last2Equal = ((array1[a1_len-1] == array2[a2_len-1]) &&
(array1[a1_len-2] == array2[a2_len-2]));
120