• Keine Ergebnisse gefunden

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

N/A
N/A
Protected

Academic year: 2022

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

Copied!
98
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

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

(2)

Übersicht

§ 9.1 Einleitung

§ 9.2 ArrayList<T>

§ ArrayList<String>

§ Wrapper Typen

§ 9.3 Vergleichen von Objekten

§ 9.4 Mengen

§ 9.5 Abbildungen

3

(3)

9.2 Zusammenfassung/Wiederholung

4

(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

(5)

9

(6)

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

(7)

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.

(8)

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

(9)

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

(10)

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]

(11)

18

(12)

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

(13)

21

(14)

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]

(15)

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

(16)

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

(17)

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

(18)

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

...

(19)

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

...

(20)

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

(21)

32

(22)

Ü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, *]

(23)

§ 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

(24)

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

}

}

(25)

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

(26)

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

}

38

(27)

Lösung (Teil 2)

ArrayList<Integer> list3 = new ArrayList<Integer>();

list3.addAll(list1);

list3.retainAll(list2);

System.out.println(list3);

39

(28)

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.

(29)

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.

(30)

9.3 Vergleichen von Objekten

42

(31)

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)

(32)

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

(33)

45

(34)

Gebrauch von compareTo

§ compareTo kann im Test einer if Anweisung gebraucht werden.

String a = "alice";

String b = "bob";

if (a.compareTo(b) < 0) { // true ...

}

(35)

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

(36)

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]

(37)

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.

(38)

§ 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

(39)

§ 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

(40)

§ 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

(41)

§ 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

(42)

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

(43)

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

(44)

58

(45)

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

(46)

Comparable Muster

public class name implements Comparable<name> { ...

public int compareTo(name other) { ...

}

}

(47)

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

}

}

61

(48)

Comparable 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

63

(49)

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

(50)

Aufgabe

§ Sie erinnern sich an die Klasse Point

65

(51)

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

}

(52)

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

(53)

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

68

(54)

compareTo 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

(55)

Comparable Beispiel

public class Point implements Comparable<Point> { private int x;

private int y;

}

(56)

Comparable Beispiel

public class Point implements Comparable<Point> { private int x;

private int y;

}

(57)

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 }

}

(58)

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 }

}

(59)

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)

(60)

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

}

(61)

Übersicht

§ 9.4 Mengen

§ 9.5 Abbildungen

76

(62)

9.4 Mengen

77

(63)

Java Collections

(64)

Ü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.

(65)

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

(66)

85

(67)

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

(68)

Kommt uns diese Liste bekannt vor?

§ Die selben Methoden sind für ArrayList definiert.

88

(69)

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

(70)

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.

(71)

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

(72)

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

(73)

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

(74)

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)

96

Klasse Zeit (ms)

LinkedList 662

ArrayList 615

(75)

§ 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

97

(76)

Messungen

§ ArrayList (ms): 593, 702, 606, 582, 594

§ LinkedList (ms): 696, 610, 676, 632, 694

98

(77)

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

(78)

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

(79)

101

(80)

252-0027

Einführung in die Programmierung

Stil und Konventionen

Teil 1

Thomas R. Gross

Department Informatik ETH Zürich

102

(81)

Übersicht

§ Einfache Regeln

§ Setzen Eclipse voraus

103

(82)

Code

104

(83)

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

(84)

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

(85)

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

(86)

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

(87)

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

(88)

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

110

(89)

Boolesche 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

(90)

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

(91)

Manchmal kann man if Statements vermeiden

113

(92)

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

(93)

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

(94)

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;

}

116

(95)

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

(96)

Vorsicht bei Array Zugriff, Dereferenzierung

118

(97)

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

(98)

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

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

(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

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

Windows: Rechtsklicken Sie auf die Datei eclipse.exe und wählen Sie Senden an → Desktop (Verknüpfung erstellen).. macOS: Ziehen Sie das Eclipse-Symbol in

§ Wenn eine Methode einen Parameter erwartet dann muss dieser auch übergeben werden. printPunkte(); // ERROR: parameter value

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

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