252-0027 Einführungin dieProgrammierungI 9.0 ...

60
252-0027 Einführung in die Programmierung I 9.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 dieProgrammierungI 9.0 ...

Page 1: 252-0027 Einführungin dieProgrammierungI 9.0 ...

252-0027Einführung indie Programmierung I

9.0Generische ProgrammierungThomasR.Gross

DepartmentInformatikETHZürichCopyright(c)Pearson2013andThomasGross2016Allrightsreserved.

Page 2: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Uebersicht

§ 9.0Einleitung

§ 9.1ArrayList<T>

§ 9.2Vergleichen vonObjekten

2

Page 3: 252-0027 Einführungin dieProgrammierungI 9.0 ...

4

Page 4: 252-0027 Einführungin dieProgrammierungI 9.0 ...

§ WelchesVerhalten sollte LinkedDoubleList haben?public interface DoubleListIF {

public double get(int index);public void set(int index, double value);public boolean isEmpty();public void addFirst(double value);public void addLast(double value);public double removeFirst();public double removeLast();public void clear();public double[] toArray();

}6

Page 5: 252-0027 Einführungin dieProgrammierungI 9.0 ...

SoftwareEntwicklung

§ Waswenn wir LinkedShapeList brauchen?

§ Können wir unsere LinkedIntList verallgemeinern?

§ Am15.11.hielten wir fest:

7

Page 6: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Collection

§ “collection”(Sammlung,Ansammlung):ein Objekt das(eineSammlung von)Daten speichert;eine ”Datenstruktur"§ DieObjeke diegespeichert werden heissen Elemente§ Einige Collectionssind geordnet;einige erlauben Duplikate§ Typische Operationen:add,remove,clear,contains (search),size

§ D.h.hinzufügen,entfernen,zurücksetzen,enthält?,Grösse

§ Begriff für eine Vielzahl vonDatenstrukturen§ Aberfür uns stehen dieOperationen im Vordergrund,nicht die

Implementation

Page 7: 252-0027 Einführungin dieProgrammierungI 9.0 ...

CollectionBeispiele

§ Beispiele aus denJavaBibliotheken:ArrayList,LinkedList,HashMap,TreeSet,PriorityQueue

§ Klassen

§ Alle CollectionKlassensind injava.util;müssen alsoimportiert werden

import java.util.*;

9

Page 8: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Java Collections

Page 9: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Abstrakte Methoden§ Abstrakte Methode ("abstractmethod"):Eine Methode die

deklariert ist aber nicht implementiert ist.§ Eine abstrakte Methode ist ein "Versprechen":bevoreine Instanz der

Klasse erstellt werden kann,mussdiesesVerhalten (diese Methode)implementiert werden.

§ Eine Erweiterung derKlasse mussdiese Methode implementieren§ Abstrakte Klasse ("abstractclass"):eine Klasse mit

mindestens einer abstrakten Methode§ Diese Klassenkoennen nicht Gebraucht werden,umInstanzen zu

erstellen.§ Basisfuer Erweiterungen

12

Page 10: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Beispielpublic interface Shape {

public double area();public double perimeter();

}public abstract class Polygon4Edges implements Shape {

protected double width;protected double height;

// Constructors

// Returns the perimeter of this rectangle.public double perimeter() {

return 2.0 * (width + height);}

} // Polygon4Edges13

Page 11: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Beispiel (Teil 2)class Rectangle extends Polygon4Edges {

// Returns the area of this rectangle.public double area() {

return width * height;}

}

class Parallelogram extends Polygon4Edges {private double angle;

// Returns the area of this parallelogram.public double area() {

return width * height * Math.sin(angle);}

}

14

Page 12: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Abstrakte Klassen

§ Nicht ein Thema dieser Vorlesung

§ Wenn Sie eine MeldungParallelogram is not abstract and does not override abstract method area() in Shape1class Parallelogram extends Polygon4Edges {^1 error

erhalten dann fehlt dieImplementierung (mindestens)einerMethode

15

Page 13: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Listen§ Liste:eine Sammlung vonObjekten dieals geordnete Folge

vonElementen gespeichert wird§ Jedes Elementkann über einen 0-basiertenIndexerreicht werden§ Eine Liste hateine Grösse Size (Anzahl Elemente diehinzugefügt

wurden)§ Elemente können am

Anfang,amEnde,oderirgendwo hinzugefügtwerden.

Page 14: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Listenobjekte

§ Eine Liste hatmehr Zustand als nur dieElemente§ Müssen auch festhalten,wasdas1.Elementist (undsinnvoll ist es

auch,dasletzte Elementzu kennen)

§ Eine Liste besteht daher aus mehr als nur denKnoten

§ Wir erstellen daher ein Objekt,dass die“Liste”der(verknüpften)Elemente representiert§ AmAnfang eine leere Liste

[]

Page 15: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Listenobjekte

§ Zu einer solchen Liste können Elemente hinzugefügt werden.§ DasdefaultVerhalten ist es,Elemente amEnde derListe

hinzuzufügen.

[hello, ABC, goodbye, okay]

§ DasListenobjekt hält fest,welche Elemente hinzugefügtwurden,denIndex,dieAnzahl derElemente,dieReihenfolge.

19

Page 16: 252-0027 Einführungin dieProgrammierungI 9.0 ...

ArrayList

§ Javastellt dieKlasse ArrayList für solche Listenobjektezur Verfügung

§ “Array”erinnert daran,dass dieElemente über einen Indexerreicht werden können

§ DieAnzahl der Elemente ist unbegrenzt (im Prinzip)

§ Eine ArrayList ist wie ein dynamischer Array(derdieGrösse andieAnzahl Elemente anpasst)

§ DieImplementationbasiert aufeinem ArrayundeinemAttribut für dieaktuelle Grösse (Anzahl Elemente) 20

Page 17: 252-0027 Einführungin dieProgrammierungI 9.0 ...

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

Page 18: 252-0027 Einführungin dieProgrammierungI 9.0 ...

ArrayListMethodenaddAll(list)addAll(index, list)

adds all elements from the given list to this list(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 listcontainsAll(list) returns true if this list contains every element from given listequals(list) returns true if given other list contains the same elementsiterator()listIterator()

returns an object used to examine the contents of the list (seen later)

lastIndexOf(value) returns last index value is found in list (-1 if not found)remove(value) finds and removes the given value from this listremoveAll(list) removes any elements found in the given list from this listretainAll(list) removes any elements not found in given list from this listsubList(from, to) returns the sub-portion of the list between

indexes from (inclusive) and to (exclusive)toArray() returns the elements in this list as an array

Page 19: 252-0027 Einführungin dieProgrammierungI 9.0 ...

DieElemente vonArrayList

§ Wasfür Elemente wollen wir inArrayList speichern?

§ Wie können wir ArrayList soaufsetzen,dass wir dieseMethoden für alle Arten vonObjekten nutzen können?§ DerTyp derElemente sollte ein Parametersein,wenn wir ein

ExemplarderKlasse ArrayList erstellen§ Javaerlaubt generische Typen (“generic types”)– Klassendefinitionen

mit einem Typparameter

24

Page 20: 252-0027 Einführungin dieProgrammierungI 9.0 ...

TypparameterArrayList<Type> name = new ArrayList<Type>();

§ Wenn wir ein ArrayList Objekt konstruieren (oder eineReferenzvariable deklarieren)dann müssen wir denTyp derElemente derListe angeben§ Der Typ der Elemente musszwischen < und> angegeben werden.§ Wir nennen dieseinen Typparameter (“typeparameter”)§ Wir haben hier eine generische Klasse (“generic” class).

Page 21: 252-0027 Einführungin dieProgrammierungI 9.0 ...

ArrayList<Type> name = new ArrayList<Type>();

§ Mit einem Typparameter kann dieArrayList Klasse verwendetwerden,umListenverschiedener Typen zu speichern.

§ Typemussein Referenztyp sein

§ Dazu später mehr§ Beispiele:

ArrayList<String> names = new ArrayList<String>();names.add(”ETH Zurich");names.add(”Imperial College");ArrayList<Object> e = new ArrayList<Object>();Object o = new Object();e.add(o); 26

Page 22: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Typparameter

§ DerTypparameter kann inderDefinitionderKlasseverwendet werden

class MyType<T> {T intern;String s;

public MyType() { } // may need default constructor

public MyType(T i) {intern = i;s = i.toString();

}}

27

Page 23: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Typparameter

§ DieKonvention ist es,einen einzelnen Grossbuchstaben alsNamen für einen Typparameter zu verwenden

class MyType<T> {}

§ Damit kann manschnell erkennen welche ParametereinenTyp bezeichnen§ Mehrere Typparameter sind möglich

§ Wir werden uns mit dem Gebrauch vongenerischen Klassenbeschäftigen§ Entwicklung generischer Klassenmusswarten 28

Page 24: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Wo kann ich mehr erfahren?

§ DieJavaAPISpecification enthält Informationen über alleKlassen,dieTeil derJavaUmgebung sind.§ Nicht Teil der Sprache sondern Teil der Umgebung.§ Sehr praktisch – wer kann sich schon alle Methoden merken

§ Konvention für Typparameter§ E– Element(häufig im JavaCollectionsFramework)§ K– Key(später mehr)§ N– Number§ T– Type(irgendwo)

Page 25: 252-0027 Einführungin dieProgrammierungI 9.0 ...

30

Page 26: 252-0027 Einführungin dieProgrammierungI 9.0 ...

31

Page 27: 252-0027 Einführungin dieProgrammierungI 9.0 ...

ArrayList im Vergleich mit Array

§ KonstruktionString[] names = new String[5];

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

§ Speichern eines Wertesnames[0] = "Jessica";

list.add("Jessica");

§ Zugriff aufein ElementString s = names[0];

String s = list.get(0);

Page 28: 252-0027 Einführungin dieProgrammierungI 9.0 ...

ArrayList im Vergleich mit Array

§ Zugriff aufalle Elemente diemit "B”anfangen:for (int i = 0; i < names.length; i++) {

if (names[i].startsWith("B")) { ... }

}

for (int i = 0; i < list.size(); i++) {if (list.get(i).startsWith("B")) { ... }

}

Page 29: 252-0027 Einführungin dieProgrammierungI 9.0 ...

ArrayList im Vergleich mit Array

§ Prüfen ob derString"Benson”dabei ist:for (int i = 0; i < names.length; i++) {

if (names[i].equals("Benson")) { ... }

}

if (list.contains("Benson")) { ... }

34

Page 30: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Eine Uebungsaufgabe

§ Schreiben Sie ein Programm daseine Datei Wordfür Wordeinliest unddieWörter derDateil als Liste speichert.§ Zuerst sollen Sie alle eingelesenen Wörter ausgeben.§ Dannsollen Sie alle Wörter inderumgekehrten Reihenfolge ausgeben.§ Danngeben Sie alle Substantive(fangen mit Grossbuchstaben an)in

Grossbuchstaben aus.§ AlsoHausà HAUS

§ Danngeben Sie dieWörter ohne Substantiveaus

Page 31: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Lösung (Gerüst)import java.util.*;import java.io.* ;

public class Example1 {public static void main(String[] args) throws

FileNotFoundException {

ArrayList<String> allWords = new ArrayList<String>();Scanner input = new Scanner(new File("words.txt"));while (input.hasNext()) {

String word = input.next();allWords.add(word);

}System.out.println(allWords);

}}

37

Page 32: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Lösung (Gerüst)import java.util.*;import java.io.* ;

public class Example1 {public static void main(String[] args) throws

FileNotFoundException {

ArrayList<String> allWords = new ArrayList<String>();Scanner input = new Scanner(new File("words.txt"));while (input.hasNext()) {

String word = input.next();allWords.add(word);

}System.out.println(allWords);

}}// Character.isUpperCase(word.charAt(0)) 38

Page 33: 252-0027 Einführungin dieProgrammierungI 9.0 ...

// remove all nounsfor (int i=0; i < allWords.size(); i++ ) {String s = allWords.get(i);if (Character.isUpperCase(s.charAt(0))) {allWords.remove(i);

i--;}

}

§ Vorsicht bei Veränderungen derListe

39

Page 34: 252-0027 Einführungin dieProgrammierungI 9.0 ...

ArrayList als Parameterpublic static void name(ArrayList<Type> name) { … }

Beispiel:// Removes all nouns from the given listpublic static void removeNouns(ArrayList<String> list) {

for (int i=0; i < list.size(); i++ ) {String s = list.get(i);if (Character.isUpperCase(s.charAt(0))) {

list.remove(i);i--;

}}

}

Page 35: 252-0027 Einführungin dieProgrammierungI 9.0 ...

ArrayList als Rückgabewert

§ Eine Liste kann auch als Ergebnis zurückgegeben werden:public static ArrayList<Type> methodName(params)

42

Page 36: 252-0027 Einführungin dieProgrammierungI 9.0 ...

ArrayListmit Basistypen?

§ TypeinArrayList<Type>mussein Referenztyp sein

§ …Typekann nicht ein Basistyp sein

// illegal -- int cannot be a type parameterArrayList<int> list = new ArrayList<int>();

§ Aber wir wollten doch dieLinkedIntList durchArrayList ersetzen …§ Wir brauchen einen Referenztyp (alsoSubtyp vonObject)der int

Werte speichert

Page 37: 252-0027 Einführungin dieProgrammierungI 9.0 ...

§ Für jeden Basistyp gibt es eine besondere Klasse (dieWrapperKlasse (“wrapper”class,Verschalungsklasse [dt]))diewir ineiner solchen Situationverwenden können§ Für int ist dasInteger

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

§ Für doubleist dasDouble// creates a list of doublesArrayList<Double> list = new ArrayList<Double>();

44

Page 38: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Wrapper Klassen

§ Ein “wrapper”(Umschlag,Verschalung)ist ein Objekt desseneinziger Zweck es ist,einen Werteines Basistyps zu speichern.

§ Eine damit konstruierte Liste kann dann wie gewöhnlichverwendet werden

Primitive Type Wrapper Typeint Integer

double Double

char Character

boolean Boolean

Page 39: 252-0027 Einführungin dieProgrammierungI 9.0 ...

WrapperKlassen

§ DasUmwandeln eines Basistyps indenentsprechendenWrapperTyp wird als “boxing” bezeichnetInteger x = 5;

int j = 7;

x = j;System.println("x = " + x);

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

47

Page 40: 252-0027 Einführungin dieProgrammierungI 9.0 ...

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

48

Page 41: 252-0027 Einführungin dieProgrammierungI 9.0 ...

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

Page 42: 252-0027 Einführungin dieProgrammierungI 9.0 ...

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

...

Page 43: 252-0027 Einführungin dieProgrammierungI 9.0 ...

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

}

}

}

51

Page 44: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Andere Uebungen§ Schreiben Sie eine Methode reverse diedieReihenfolge

derElemente einer ArrayList für Stringsumkehrt.

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

Page 45: 252-0027 Einführungin dieProgrammierungI 9.0 ...

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.

Page 46: 252-0027 Einführungin dieProgrammierungI 9.0 ...

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

54

index 0 1 2 3

value Bob Pete Vicki Sue

Page 47: 252-0027 Einführungin dieProgrammierungI 9.0 ...

57

Page 48: 252-0027 Einführungin dieProgrammierungI 9.0 ...

60

Page 49: 252-0027 Einführungin dieProgrammierungI 9.0 ...

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

Page 50: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Uebung§ Schreiben Sie eine Methode addStars dieeine ArrayList

vonStringsals Parameterhatundeinen “*” nach jedemElementeinfügt.

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

§ Dann ist der Effekt desAufrufs addStars(list); diese Liste:[die, *, schnelle, *, graue, *, Schlange, *]

Page 51: 252-0027 Einführungin dieProgrammierungI 9.0 ...

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

64

Page 52: 252-0027 Einführungin dieProgrammierungI 9.0 ...

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

}

}

Page 53: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Uebung§ Schreiben Sie eine Methode intersect diezwei ArrayListen

mit ganzen Zahlen als Parameterakzeptiert undeine neueArrayList zurü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]

Page 54: 252-0027 Einführungin dieProgrammierungI 9.0 ...

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

}67

Page 55: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Lösung (Teil 2)

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

list3.addAll(list1);

list3.retainAll(list2);

System.out.println(list3);

68

Page 56: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Collectionsals Attribut vonObjekten

§ Ein Objekt kann einen Array,eine ArrayList,oder jedebeliebige Sammlung als Attribut haben.

public class Course {private double[] grades;private ArrayList<String> studentNames;private ArrayList<Double> studentGrades;

public Course() {grades = new double[4];studentNames = new ArrayList<String>();...

}

§ Jede Instanz enthält jetzt zwei CollectionObjekte.

Page 57: 252-0027 Einführungin dieProgrammierungI 9.0 ...

DiecompareToMethode

§ UmdasVergleichen vonInstanzen zu ermöglichen sollte eineJavaKlasse eine Methode compareTo definieren,dieaufderMenge derInstanzen eine (totale)Ordnungsrelation ≤definiert§ Diese erlaubt es dann zwei Instanzen zu vergleichen.§ A≤Boder B≤A§ A≤BundB≤A:A=B

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

Page 58: 252-0027 Einführungin dieProgrammierungI 9.0 ...

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

71

Page 59: 252-0027 Einführungin dieProgrammierungI 9.0 ...

Gebrauch voncompareTo

§ compareTo kann im Testeiner if Anweisung gebrauchtwerden.

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

...}

Page 60: 252-0027 Einführungin dieProgrammierungI 9.0 ...

73

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