2
Übersicht
§ 9.1 Einleitung
§ 9.2 ArrayList<T>
§ 9.3 Vergleichen von Objekten
3
Software Entwicklung [vom 13. 11.]
§ Programmieren ist anspruchsvoll
§ Es ist leicht Fehler zu machen
§ Zwei Ansätze diese Aufgabe zu lösen
§ Abstraktion
§ Wiederverwendung von Software
§ Wir würden gerne Software wiederverwenden
§ Auf früheren Lösungen aufbauen
§ Von LinkedPointList zu LinkedShapeList, LinkedPersonList, ….
4
Von Linked Int List zu Linked Point List
§ Wir hatten LinkedIntList gesehen
§ Eine Liste von int (ganzen Zahlen)
§ Methoden int get(int), int pop(); int top(), push(int), addLast(int), addFirst(int), etc.
5
LinkedIntList Interface
public interface IntListIF {
public int get(int index);
public void set(int index, int value);
public boolean isEmpty();
public int top();
public int pop();
public int removeFirst();
public void addFirst(int value);
public void push(int value);
public void clear();
public int[] toArray();
// … usw
6LinkedIntList mit Interface
/** * A singly-linked list of integer values with
* fast addFirst and addLast methods
*/
public class LinkedIntList implements IntListIF { public int get(int index) { .. }
public void set(int index, int value) { .. } public boolean isEmpty() { .. }
public void addFirst(int value) { .. } /** * For internal use only.
*/
private LIntNode getNode(int index) { .. } public LIntNode first;
} ....
7Von Linked Int List zu Linked Point List
§ Wir hatten LinkedIntList gesehen
§ Eine Liste von int (ganzen Zahlen)
§ Methoden int get(), int pop(); int top(), push(int), addLast(int), addFirst(int), etc.
§ Wir können uns auch eine Liste von Point Objekten vorstellen
§ Eine Liste von Verweisen auf Point Exemplare
§ Methoden Point get(), Point pop(); Point top(), push(Point), addLast(Point), addFirst(Point), etc.
§ LinkedPointList
8
Reference Semantics!
LinkedPointList Interface
public interface PointListIF {
public Point get(int index);
public void set(int index, Point value);
public boolean isEmpty();
public Point pop();
public Point top();
public Point removeFirst();
public void addFirst(Point value);
public void push(Point value);
public void clear();
public Point[] toArray();
// … usw
9LinkedPointList
/** * A singly-linked list of Point references with
* fast addFirst and addLast methods
*/
public class LinkedPointList implements PointListIF { public Point get(int index) { .. }
public void set(int index, Point value) { .. } public boolean isEmpty() { .. }
public void addFirst(Point value) { .. } } ....
10
Von Linked Point List zu Linked Shape List
§ Wir können uns auch eine Liste von Shape Objekten vorstellen
§ Eine Liste von Verweisen auf Exemplare des Typs Shape
§ Exemplare der Klassen Circle, Rectangle, Triangle (die Shape implementieren)
§ Methoden Shape get(), Shape pop(); Shape top(), push(Shape), addLast(Shape), addFirst(Shape), etc.
§ Wie wollen wir diese Interfaces (und später) Klassen erstellen?
§ Wir können das PointListIF kopieren und editieren …
11
LinkedShapeList Interface
public interface ShapeListIF {
public Shape get(int index);
public void set(int index, Shape value);
public boolean isEmpty();
public Shape pop();
public Shape top();
public Shape removeFirst();
public void addFirst(Shape value);
public void push(Shape value);
public void clear();
public Shape[] toArray();
// … usw
12Interfaces
§ Trennen sichtbares Verhalten (geforderte Methoden) von der Implementation dieser Methoden
§ Interface: Methodennamen (inkl. Parameter und Rückgabewert) – abstrakte Methoden
§ Klasse (die Interface implementiert): Konkretes Programm
§ Können Implementation verbessern/ändern ohne Klienten zu ändern
§ Aber Interfaces arbeiten mit [fixen] Typen (Klassen)
§ PointListIF, ShapeListIF, ….
13
§ Wir wollen möglichst einfach (für die Programmierung) mit unterschiedlichen Exemplaren arbeiten können
§ Listen und ähnliche Datenstrukturen werden häufig
gebraucht, wir wollen nicht immer das Rad (das Interface) neu erfinden müssen
14
Eine Aufgabe
§ Einlesen einer Datei von Wörtern
§ Bearbeiten der Substantive (fangen mit einem Grossbuchstaben an)
§ …
§ Was für eine Datenstruktur würden wir nehmen?
15
Eine naïve Lösung
String[] allWords = new String[1000];
int wordCount = 0;
Scanner input = new Scanner(new File("data.txt"));
while (input.hasNext()) {
String word = input.next();
allWords[wordCount] = word;
wordCount++;
}
§ Problem: Wie viele Wörter sind in der Datei?
§ Zum Glück haben wir ja schon Listen kennengelernt
16
LinkedIntList, LinkedPointList, LinkedShapeList, …
§ LinkedIntList: Menge von int Werten (ganzen Zahlen)
§ LinkedIntList : sortierte Menge von int Werten
§ LinkedIntList : Reihe von int Werten (ganzen Zahlen) in der Reihenfolge des Einfügens
§ LinkedPointList : Menge von Point Referenzen
§ …
§ LinkedShapeList: Menge von Shape Referenzen
§ …
17Linked_irgendein_Typ_List
§ LinkedPointList : Menge von Point Referenzen
§ LinkedShapeList : Menge von Shape Referenzen
§ LinkedStringList : Menge von String s
§ LinkedFileList: Menge von File Referenzen
§ …
18
Linked_ein_Typ_irgendeine_Interpretation
§ LinkedPointList: Menge von Point Werten (2D Punkten)
§ LinkedPointList: sortierte Menge von Point Referenzen
§ Sortiert entlang der X-Achse (oder Y-Achse, oder Abstand von (0,0))
§ LinkedPointList : Reihe von Point Referenzen in der Reihenfolge des Einfügens
§ LinkedPointList: Reihe von Point Referenzen in der
Reihenfolge in der sie gezeichnet werden sollen
19LinkedPointList, LinkedShapeList, …
§ LinkedPointList: Menge von Point Referenzen
§ LinkedShapeList : Reihe von Shape Referenzen
§ LinkedStringList : sortierte Menge von String s
§ LinkedFileList: Menge von File Referenzen gemeinsam: Ansammlung ("Collection")
20
22
25
Java Collections
Java Collections
Java Collections
Zurück zu unserer Aufgabe
§ Ein genauerer Blick auf Listen
§ und was für Listen von den Collection Klassen angeboten werden
37
Listen
§ Liste: eine Sammlung von Objekten die als geordnete Folge von Elementen gespeichert wird
§ Jedes Element kann über einen 0-basierten Index erreicht werden
§ Eine Liste hat eine Grösse Size (Anzahl Elemente die hinzugefügt wurden)
§ Elemente können am
Anfang, am Ende, oder
irgendwo hinzugefügt
werden.
Listenobjekte
§ Eine Liste hat mehr Zustand als nur die Elemente
§ Müssen auch festhalten, was das 1. Element ist (und sinnvoll ist es auch, das letzte Element zu kennen)
§ Eine Liste besteht daher aus mehr als nur den Knoten
§ Wir erstellen daher ein Objekt, dass die "Liste" der (verknüpften) Elemente representiert
§ Am Anfang eine leere Liste
[]
Listenobjekte
§ Zu einer solchen Liste können Elemente hinzugefügt werden.
§ Das default Verhalten ist es, Elemente am Ende der Liste hinzuzufügen.
[hello, ABC, goodbye, okay]
§ Das Listenobjekt hält fest, welche Elemente hinzugefügt wurden, den Index, die Anzahl der Elemente, die
Reihenfolge.
40
9.2 ArrayList
41
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 der Elemente ist unbegrenzt (im Prinzip)
§ Eine ArrayList ist wie ein dynamischer Array (der die Grösse an die Anzahl Elemente anpasst)
§ Die Implementation basiert auf einem Array und einem Attribut für die aktuelle Grösse (Anzahl Elemente)
42
43
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]"ArrayList Methoden
addAll(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 list containsAll(list) returns true if this list contains every element from given list equals(list) returns true if given other list contains the same elements iterator()
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 list
removeAll(list) removes any elements found in the given list from this list retainAll(list) removes any elements not found in given list from this list subList(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
Die Elemente von ArrayList
§ Was für Elemente wollen wir in ArrayList speichern?
§ Wie können wir ArrayList so aufsetzen, dass wir diese Methoden für alle Arten von Objekten nutzen können?
46
Die Elemente von ArrayList
§ Was für Elemente wollen wir in ArrayList speichern?
§ Wie können wir ArrayList so aufsetzen, dass wir diese Methoden für alle Arten von Objekten nutzen können?
§ Der Typ der Elemente sollte ein Parameter sein, wenn wir ein Exemplar der Klasse ArrayList erstellen
§ Java erlaubt generische Typen ("generic types") – Klassendefinitionen mit einem Typparameter
47
Typparameter
ArrayList< Type > name = new ArrayList< Type >();
§ Wenn wir ein ArrayList Objekt konstruieren (oder eine Referenzvariable deklarieren) dann müssen wir den Typ der Elemente der Liste angeben
§ Der Typ der Elemente muss zwischen < und > angegeben werden.
§ Wir nennen dies einen Typparameter ("type parameter")
§ Wir haben hier eine generische Klasse ("generic" class).
ArrayList< Type > name = new ArrayList< Type >();
§ Mit einem Typparameter kann die ArrayList Klasse verwendet werden, um Listen verschiedener Typen zu verwalten.
§ Type muss ein Referenztyp sein
§ Dazu später mehr
§ Beispiele:
ArrayList<String> names = new ArrayList<String>();
names.add("ETH Zurich");
names.add("Imperial College");
49
ArrayList< Type > name = new ArrayList< Type >();
§ Beispiele:
ArrayList<Point> figure = new ArrayList<Point>();
Point p = new Point(1,3);
figure.add(new Point());
figure.add(p);
System.out.println(figure.size());
ArrayList<Shape> figure = new ArrayList<Shape>();
Shape s = new Circle();
figure.add(s);
50
Typparameter
§ Der Typparameter kann in der Definition einer Klasse verwendet werden
class MyType<T> { T intern;
String s;
public MyType() { } // may need default constructor public MyType(T i) {
intern = i;
s = i.toString();
}
public String toString() { return s;
} }
52Dann …
MyType<Point> mine;
Point p = new Point(2,4);
mine = new MyType<Point>(p);
Dann …
MyType<Point> mine;
Point p = new Point(2,4);
mine = new MyType<Point>(p);
Typparameter
§ Die Konvention ist es, einen einzelnen Grossbuchstaben als Namen für einen Typparameter zu verwenden
class MyType<T> { }
§ Damit kann man schnell erkennen welche Parameter einen Typ bezeichnen
§ Mehrere Typparameter sind möglich
§ Wir werden uns zuerst mit dem Gebrauch von generischen Klassen beschäftigen
§ Entwicklung generischer Klassen muss warten
53Wo kann ich mehr erfahren?
§ Die Java API Specification enthält Informationen über alle Klassen, die Teil der Java Umgebung 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 Java Collections Framework)
§ K – Key (später mehr)
§ N – Number
§ T – Type (irgendwo)
55
https://docs.oracle.com/javase/10/docs/api/
java/util/List.html
56
Später mehr
57
58
59
60
61
Später mehr
Beispiel - einfach
import java.util.*;
public class ListTest {
public static void main (String[] args) {
ArrayList<String> list = new ArrayList<String>();
names.add("ETH Zurich");
names.add("Imperial College");
names.add("ETH Lausannee");
for (int i = 0; i < names.size(); i++) { if (names.get(i).startsWith("ETH")) {
System.out.println(names.get(i));
} }
}
}
62ArrayList – Methoden
§ Hinzufügen eines Elements
// ["A", "B", "C"]list.add("X");
// ["A", "B", "C", "X"]§ Einfügen eines Elements
list.add(2, "Y");
// ["A", "B", ,"Y", "C", "X"]§ Zugriff auf ein Element
String s = list.get(3);
// "C"§ Entfernen eines Elements
list.remove(2);
// ["A", "B", "C", "X"]ArrayList – Methoden
§ Hinzufügen eines Elements
// ["A", "B", "C"]list.add("X");
// ["A", "B", "C", "X"]§ Einfügen eines Elements
list.add(2, "Y");
// ["A", "B", ,"Y", "C", "X"]§ Zugriff auf ein Element
String s = list.get(3);
// "C"§ Entfernen eines Elements
list.remove(2);
// ["A", "B", "C", "X"]§ Entfernen eines Elements
list.remove("B");
// ["A", "C", "X"]Beispiel
import java.util.*;
public class ListTest {
public static void main (String[] args) {
ArrayList<String> names = new ArrayList<String>();
names.add("ETH Zurich");
names.add("Imperial College");
names.add("ETH Lausanne");
for (int i = 0; i < names.size(); i++) { if (names.get(i).startsWith("ETH")) {
System.out.println(names.get(i));
} }
}
}
66ArrayList im Vergleich mit Array
§ Konstruktion
String[] names = new String[5];
ArrayList<String> list = new ArrayList<String>();
§ Speichern eines Wertes
names[0] = "Jessica";
list.add("Jessica");
§ Zugriff auf ein Element
String s = names[0];
String s = list.get(0);
ArrayList im Vergleich mit Array
§ Zugriff auf alle Elemente die mit "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")) { ... }
}
ArrayList im Vergleich mit Array
§ Prüfen ob der String "Benson" dabei ist:
for (int i = 0; i < names.length; i++) { if (names[i].equals("Benson")) { ... } }
if (list.contains("Benson")) { ... }
69
Die Aufgabe, 2. Version
§ Schreiben Sie ein Programm das eine Datei Word für Word einliest und die Wörter der Datei als Liste speichert.
§ Zuerst sollen Sie alle eingelesenen Wörter ausgeben.
§ Dann sollen Sie alle Wörter in der umgekehrten Reihenfolge ausgeben.
§ Dann geben Sie alle Substantive (fangen mit Grossbuchstaben an) in Grossbuchstaben aus.
§ Also Haus à HAUS
§ Dann geben Sie die Wörter ohne Substantive aus
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);
} }
72
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))
73// remove all nouns
for (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 der Liste
78
ArrayList als Parameter
public static void name(ArrayList<Type> name) { … }
Beispiel:
//
Removes all nouns from the given list
public 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--;
} } }
ArrayList als Rückgabewert
§ Eine Liste kann auch als Ergebnis zurückgegeben werden:
public static ArrayList<Type> methodName(params)
82
ArrayList mit Basistypen?
§ Type in ArrayList<Type> muss ein Referenztyp sein
§ … Type kann nicht ein Basistyp sein
// illegal -- int cannot be a type parameter ArrayList<int> list = new ArrayList<int>();
§ Aber wir wollten doch die LinkedIntList durch ArrayList ersetzen …
§ Wir brauchen einen Referenztyp (also Subtyp von Object) der int
Werte speichert
§ Für jeden Basistyp gibt es eine besondere Klasse (die
Wrapper Klasse ("wrapper" class, Verschalungsklasse [dt])) die wir in einer solchen Situation verwenden können
§ Für int ist das Integer
// creates a list of wrapped int values
ArrayList<Integer> list = new ArrayList<Integer>();
§ Für double ist das Double
// creates a list of wrapped double values
ArrayList<Double> list = new ArrayList<Double>();
84
Wrapper Klassen
§ Ein "wrapper" (Umschlag, Verschalung) ist ein Objekt dessen einziger Zweck es ist, einen Wert eines Basistyps zu
speichern.
§ Eine damit konstruierte Liste kann dann wie gewöhnlich verwendet werden
Primitive Type Wrapper Type
int Integer
double Double char Character boolean Boolean
86
87
Was fehlt?
§ Was sind die Attribute?
§ Was würden wir erwarten?
§ Vielleicht ….
88
Integer
§ Es gibt kein Attribute ("field") welches den Wert speichert
§ Daher kann der Wert auch nicht verändert werden
§ Keine der Methoden lässt das zu.
89
Wrapper Klassen
§ Das Umwandeln eines Basistyps in den entsprechenden Wrapper Typ wird als "boxing" bezeichnet
Integer bigI = 5;
int j = 7;
bigI = j;
System.println("bigI = " + bigI);
§ Der Zugriff auf den Basistypwert wird als "unboxing" bezeichnet
int k = bigI;
System.println("k = " + k);
90
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);
}
91Integer 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);
}
92777 333
666
777
Wrapper Klassen
§ Eine mit Wrappern konstruierte Liste kann dann wie gewöhnlich verwendet werden
ArrayList<Double> noten = new ArrayList<Double>();
noten.add(5.75);
noten.add(3.5);
...
double myGrade = noten.get(0);
93