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
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]
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]
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);
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
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);
}
}
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
§ 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
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]
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 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());}
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
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]"
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
Top Related