252-0027 Einführungin dieProgrammierung 10.0 ... · PDF fileArrayListvon Strings...

84
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 All rights reserved.

Transcript of 252-0027 Einführungin dieProgrammierung 10.0 ... · PDF fileArrayListvon Strings...

252-0027Einführung indie Programmierung

10.0Generische ProgrammierungThomasR.Gross

DepartmentInformatikETHZürichCopyright(c)Pearson2013andThomasGross2016Allrightsreserved.

Uebersicht

§ 10.0Einleitung

§ 10.1ArrayList<T>§ ArrayList<Person>§ WrapperTypen

§ 10.2Vergleichen vonObjekten

§ 10.3Mengen

§ 10.4Abbildungen

2

ArrayList

§ TypeinArrayList<Type>mussein Referenztyp sein§ …Typekann nicht ein Basistyp sein

§ WrapperTypes:int:Integer,double:Double,boolean:Boolean,….§ Referenztypen dieeinen Wertdesentsprechenden Basistyps

enthalten

// creates a list of intsArrayList<Integer> score = new ArrayList<Integer>();

// creates a list of doublesArrayList<Double> grade = new ArrayList<Double>();

§ Eine sokonstruierte Liste kann dann wie gewöhnlichverwendet werden

4

WrapperKlassen§ DasUmwandeln eines Basistyps indenentsprechenden Wrapper

Typ wird als “boxing” bezeichnetInteger bigI = 5;

int j = 7;

bigI = j;System.println(”bigI = " + bigI);

§ Der Zugriff aufdenBasistypwert wird als “unboxing”bezeichnetint k = bigI;System.println("k = " + k);

5

IntegerParameter

§ Wasgibt diesesProgramm(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);

}6

IntegerParameter

§ Wasgibt diesesProgramm(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);

}7

777333666777

WrapperKlassen

§ Eine mit Wrappern konstruierte Liste kann dann wiegewöhnlich verwendet werden

ArrayList<Double> noten = new ArrayList<Double>();noten.add(5.75);noten.add(3.5);...double myGrade = noten.get(0);

8

Legale undIllegale Indize

§ DerIndexfür einen Zugriff aufein ElementderListe musszwischen 0undderGrösse derListe - 1liegen (einschliesslich)

§ 0 <=index<=list.size()- 1.§ Ein Zugriff aufein Elementausserhalb diesesBereichs hateineIndexOutOfBoundsException 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)); // okaySystem.out.println(names.get(3)); // okaySystem.out.println(names.get(-1)); // exceptionnames.add(9, "Aimee"); // exception

10

index 0 1 2 3

value Bob Pete Vicki Sue

11

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

§ Wasgibt diesesProgrammsegment 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]}

§ Wasgibt diesesProgrammsegment aus?

for (int i = 0; i < list.size(); i++) {list.remove(i);

}System.out.println(list);

§ Answer:[20, 40, 60, 80, 100]

14

15

ArrayList ”Rätsel"2ArrayList<Integer> list = new ArrayList<Integer>();for (int i = 1; i <= 5; i++) {

list.add(2 * i); // [2, 4, 6, 8, 10]}

§ Wasgibt diesesProgrammsegment 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);

ArrayList ”Rätsel"2ArrayList<Integer> list = new ArrayList<Integer>();for (int i = 1; i <= 5; i++) {

list.add(2 * i); // [2, 4, 6, 8, 10]}

§ Wasgibt diesesProgrammsegment 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]

18

ArrayList ”Rätsel"3ArrayList<Integer> list = new ArrayList<Integer>();for (int i = 1; i <= 5; i++) {

list.add(2 * i); // [2, 4, 6, 8, 10]}

§ Wasgibt diesesProgrammsegment aus?

for (int i = 0; i < list.size(); i++) {list.add(i, 777); // add 777 at index i

}System.out.println(list);

20

Uebung

§ Schreiben Sie ein Programm daseine Datei mit ganzen Zahlenliest unddann dieZahlen als Liste druckt:§ Dann drucken Sie denDurchschnitt der Zahlen.§ Geben Sie diegrösste unddiekleinste Zahl aus.§ Filtern (d.h.entfernen)Sie alle geraden Zahlen (Zahlen diedurch 2

ohne Restteilbar sind).

ArrayListMethodenadd(value) appends value at end of listadd(index, value) inserts given value just before the given index,

shifting subsequent values to the rightclear() removes all elements of the listindexOf(value) returns first index where given value is found

in list (-1 if not found)get(index) returns the value at given indexremove(index) removes/returns value at given index, shifting

subsequent values to the leftset(index, value) replaces value at given index with given valuesize() returns the number of elements in listtoString() 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);

}

}

}

25

26

Uebung

§ Schreiben Sie eine Methode addStars dieeine ArrayListvonStringsals Parameterhatundeinen “*” nach jedemElementeinfügt.

§ Beispiel :Wenn dieArrayList list amAnfang enthält:[die, schnelle, graue, Schlange]

§ Dannist derEffekt desAufrufs addStars(list) diese Liste:[die, *, schnelle, *, graue, *, Schlange, *]

§ Schreiben Sie eine Methode removeStars dieeineArrayList vonStringsals Parameterhatinderjedes zweiteElementein “*”ist,undentfernen Sie diese Sterne(machenalsodenEffekt derMethode addStars rückgängig).

28

Lösungenpublic 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);

}

}

30

Uebung§ Schreiben Sie eine Methode intersect diezwei ArrayListen mit

ganzen Zahlen als Parameterakzeptiert undeine neue ArrayListzurückgibt,dienur dieElemente enthält,dieinbeiden Listenvorhanden sind.§ Beispiel:Wenn list1 undlist2 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 vonintersect(list1, list2) dieListe:[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);

}32

Lösung (Teil 2)

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

list3.addAll(list1);

list3.retainAll(list2);

System.out.println(list3);

33

Andere Uebungen

§ Schreiben Sie eine Methode reverse diedieReihenfolgederElemente einer ArrayList für Stringsumkehrt.

§ Schreiben Sie eine Methode capitalizeAdverbs diealsParametereine ArrayList vonStringObjekten entgegennimmt undjedes Worteines englischen Textes,dasmit “ly"endet,mit Grossbuchstaben schreibt.

Collectionsals Attribut vonObjekten

§ Ein Objekt kann einen Array,eine ArrayList,oder jedebeliebige 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 Exemplarenthält jetzt zwei CollectionObjekte.

DiecompareToMethode

§ UmdasVergleichen vonExemplaren zu ermöglichen sollteeine JavaKlasse eine Methode compareTo definieren,dieaufderMenge derExemplare eine (totale)Ordnungs-relation≤definiert§ Diese erlaubt es dann zwei Exemplare zu vergleichen.§ A≤Boder B≤A§ A≤BundB≤A:A=B

§ Beispiel:in der String Klasse gibt es dieMethodepublic int compareTo(String other)

compareTo für String

§ Beispiel:inder String Klasse gibt es dieMethodepublic int compareTo(String other)

§ Ein Aufruf A.compareTo(B) liefert:einen Wert<0 wenn A ”vor"B inder Ordnungsrelation ist,einen Wert>0 wenn A ”nach"B inder Ordnungsrelation ist,oder 0 wenn A undB inderOrdnungsrelation ”gleich"sind

37

Gebrauch voncompareTo

§ compareTo kann im Testeiner if Anweisung gebrauchtwerden.

String a = "alice";String b = "bob";if (a.compareTo(b) < 0) { // true

...}

39

Gebrauch voncompareTo

Primitives Objectsif (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 undCollections

§ DieMethode für binäre Suche funktioniert für ArraysundArrayLists dadiese Methode (intern)diecompareToMethode aufruft.String[] a = {"al", "bob", "cari", "dan", "mike"};int index = Arrays.binarySearch(a, "dan"); // 3

§ Auch sortieren ist deswegen möglichString [] s = {"my", "dog", "has", "fleas"};Arrays.sort(s);System.out.println(Arrays.toString(a));

§ Output:[dog, fleas, has, my]

§ Wie können wir mit einer ArrayList arbeiten?§ Wie dieKlasse Arrays gibt es auch eine Klasse Collections

dienützliche Methoden für Collectionsenthält§ zum Beispiel sort

41

§ Wie können wir mit einer ArrayList arbeiten?§ Wie dieKlasse Arrays gibt es auch eine Klasse Collections

dienützliche Methoden für Collectionsenthält§ Fall1:DieObjekte derArrayList stellen compareTo zur Verfügung

ArrayList<String> list1 = new ArrayList<String>();

for (int i = 0; i < s.length; i++)

list1.add(new String(s[i]));

Collections.sort(list1);

§ Output:[dog, fleas, has, my]42

§ Wie können wir mit einer ArrayList mit beliebigen Objektenarbeiten?§ Fall2:Selbstdefinierte Klassen

Beispiel:Wir halten zu jedemWortdiePositiondesersten Auftretensineinem Textfest

public class Word {String item;int position;int count;

Word(String n) {item = n;

}} 43

public class Word {String item;int position;

Word(String n) {item = n;

}}

44

§ Wie können wir mit einer ArrayList mit beliebigen Objektenarbeiten?§ Fall2:Selbstdefinierte KlassenString [] 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);45

Sieht gutaus,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

46

Selbstdefinierte Typen ordnen

§ Wir können eine beliebige ArrayList nicht sortieren daJavanicht weiss,wie dieElemente zu ordnen sind.

§ Unsere Klasse (Word)mussklar machen,wie dieElementegeordnet sind§ Dafür gibt es ein InterfacedascompareTo enthält

Comparable

public interface Comparable<E> {public int compareTo(E other);

}

§ Eine Klasse kann dasInterfaceComparable implementierenundsoeine natürliche Ordnung für ihre Exemplare definieren.§ Natürliche Ordnung:es gibt nur eine Ordnungsrelation§ Wenn wir mehrere Relationen zulassen wollen dann wird es

komplizierter

Comparable

§ Ein Aufruf A.compareTo(B) liefert:einen Wert<0 wenn A ”vor"B inderOrdnungsrelation ist,einen Wert>0 wenn A ”nach"B inderOrdnungsrelation ist,oder 0 wenn A undB inderOrdnungsrelation ”gleich"

sind

49

ComparableMusterpublic class name implements Comparable<name> {

...

public int compareTo(name other) {

...

}

}

Comparable Beispielclass Word implements Comparable<Word> {

String item;

int position;

int count;

… //constructor

public int compareTo(Word otherword) {

String compareItem = otherword.item;

return (item.compareTo(compareItem));

}

} 51

52

Comparable Beispiel

§ Waswenn wir jetzt dieExemplare auch nach derPositionoderderHäufigkeit ordnen wollen?§ Dannhätten wir drei mögliche Ordnungsrelationen

1. Lexikographisch aufGrund desNamens2. Nach Häufigkeit3. Nach derPositiondes1.Auftretens

§ Geht auch aber dazu müssen wir ein besonderes Objekt konstruieren,einen Comparator<T>

§ Später 53

compareTo undCollections§ Auch andere Collectionsnutzen diese Methode.

§ Java'sTreeSet/Map braucht interncompareTo umeineOrdnung 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 andieKlasse Point

55

Klasse Pointpublic 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 andieKlasse Point

§ Wir wollen diePoint Exemplare sortieren können§ DasXAttribut entscheidet,ob ein Point vor einem anderen ist,und

wenn dieXAttributegleich sind,dann entscheidet dasYAttribut

57

Aufgabe

§ Sie erinnern sich andieKlasse Point

§ Wir wollen diePointExemplare sortieren§ point1"vor"point2wenn

§ point1.x<point2.xoder§ point1.x==point2.xundpoint1.y<point2.y

§ point1"nach"point2wenn

§ point1.x>point2.xoder§ point1.x==point2.xundpoint1.y>point2.y

§ sonst point1"gleich"point2 58

compareTo für Point

§ Ein Aufruf A.compareTo(B) liefert:einen Wert<0 wenn A ”vor"B inder Ordnungsrelation ist,einen Wert>0 wenn A ”nach"B inder Ordnungsrelation ist,oder 0 wenn A undB inderOrdnungsrelation ”gleich"sind

59

Comparable Beispielpublic class Point implements Comparable<Point> {

private int x;private int y;

}

Comparable Beispielpublic class Point implements Comparable<Point> {

private int x;private int y;

}

Comparable fürPoint

// sort by x and break ties by ypublic 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 mandurch Subtraktionentsprechender Werte denfür compareTo gewünschtenRückgabewert erhalten:

// sort by x and break ties by ypublic 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 mandurch Subtraktionentsprechender Werte denfür compareTo gewünschtenRückgabewert erhalten:

§ DieIdee:§ ifx > other.x, thenx - other.x > 0

§ ifx < other.x, thenx - other.x < 0

§ ifx == other.x, thenx - other.x == 0

§ Achtung:Dieser Weg funktioniert nicht für reelle Zahlen (doubles)aber siehe Math.signum(double)

compareTo Diskussion§ toString - Wenn dietoString Darstellung derExemplare der

Ordnungsrelation entspricht,dann können wir sovergleichen:

// sort by date, e.g. "09/19" > "04/01"public int compareTo(Date other) {

return toString().compareTo(other.toString());}

§ Delegation– Wenn dieExemplare Attributehaben,dieverglichen werdenkönnen (z.B.Strings)dann kann manderen compareToMethodeverwenden :

// sort by employee name, e.g. "Jim" < "Susan"public int compareTo(Employee other) {

return name.compareTo(other.getName());}

Uebersicht

§ 10.3Mengen

§ 10.4Abbildungen

66

Javacollectionsframework

Uebung

§ Schreiben Sie ein Programm,daszählt wie viele verschiedeneWörter ineinem Textauftauchen (z.B.,Tolstois “KriegundFrieden”[Война и мир]oder Goethes “Faust”).

§ Speichern Sie dieWörter ineiner (An)Sammlung undgeben Sie dieAnzahl deraufgetretenen Wörter aus.

§ Sind“[das]Gute”,“gute”,“gut”,“guter”,“guten”verschieden?

§ Nach dem Einlesen desTextes sollte es möglich sein,festzustellen obein bestimmtes Wortim Textauftritt.

Sammlungen

§ Wasfür eine Collectionist diebeste für diesesProblem?

§ Wie kann mandiese Frage beantworten?Wasmüssen wirwissen?

69

70

71

List<E>

72

LinkedList<E>

73

LinkedList Methodenadd(value) appends value at end of listadd(index, value) inserts given value just before the given index,

shifting subsequent values to the rightclear() removes all elements of the listindexOf(value) returns first index where given value is found

in list (-1 if not found)get(index) returns the value at given indexremove(index) removes/returns value at given index, shifting

subsequent values to the leftset(index, value) replaces value at given index with given valuesize() returns the number of elements in listtoString() returns a string representation of the list

such as "[3, 42, -7, 15]"

Kommt uns diese Liste bekannt vor?

75

Kommt uns diese Liste bekannt vor?

§ Dieselben Methoden sind für ArrayList definiert.

76

ArrayListMethodenadd(value) appends value at end of listadd(index, value) inserts given value just before the given index,

shifting subsequent values to the rightclear() removes all elements of the listindexOf(value) returns first index where given value is found

in list (-1 if not found)get(index) returns the value at given indexremove(index) removes/returns value at given index, shifting

subsequent values to the leftset(index, value) replaces value at given index with given valuesize() returns the number of elements in listtoString() returns a string representation of the list

such as "[3, 42, -7, 15]"

DasKleingedruckte

§ LinkedList:get(index) braucht O(n) Zeit

§ ArrayList:get(index)braucht O(1) Zeit

78

Praktische Analyse

§ Müssen dasLaufzeitverhalten für realistischen Inputmessen§ Wasist “realistischer”Input?

§ Zeitmessungen nicht einfach§ JavaSystemhatviele Komponenten (einige haben wir noch garnicht

kennengelernt)undverschiedene Compiler§ Einfache Messung gibt uns “end-to-end”Uebersicht

§ System.currentTimeMillis()

§ Eingebaut

79

System.currentTimeMillis()

§ Gibt dieZeit (inms)seit 00:00,1.Januar 1970.

§ Typ desRückgabewertes ist long§ Ein anderer Basistyp§ Wie int nur mit einer Darstellung diemehr Bits(64)erfordert

§ Kann wiederholt aufgerufen werden umdieAusführungszeiteiner (genügend lange laufenden)Methode zu messen

80

Empiricalanalysis

Runningaprogramandmeasuringitsperformance

System.currentTimeMillis()

§ Returnsanintegerrepresentingthenumberofmillisecondsthathavepassedsince12:00am,January1,1970.§ Theresultisreturnedasavalueoftypelong,whichislikeintbutwithalargernumericrange(64bitsvs.32).

§ Canbecalledtwicetoseehowmanymillisecondshaveelapsedbetweentwopointsinaprogram.

Beispiel

§ ThomasMann,DieBuddenbrooks,1'602'177Bytes§ Quelle:Projekt Guttenberg

§ Messungen

82

Klasse Zeit (ms)LinkedList 1761

ArrayList 1242

Beispiel

§ ThomasMann,DieBuddenbrooks,1'602'177Bytes§ Quelle:Projekt Guttenberg

§ Messungen

§ Intel(R)Xeon(TM)CPU2.80GHz 83

Klasse Zeit (ms)LinkedList 1761

ArrayList 1242

§ Ernsthafte Evaluationen müssen viele Aspekte berücksichtigen

§ Mehrfache Ausführung desselben Programms§ Durchschnitt (arithmetisch,harmonisch,geometrisch)§ k-out-of-N

§ Prozessoren sind komplex§ Speicher Hierarchie§ Echte ClockRate(hier 2793.304MHz)

§ JavaUmgebung ist komplex84