• Keine Ergebnisse gefunden

§ 9.1 Einleitung § 9.2 ArrayList<T> § 9.3 Vergleichenvon Objekten Übersicht

N/A
N/A
Protected

Academic year: 2022

Aktie "§ 9.1 Einleitung § 9.2 ArrayList<T> § 9.3 Vergleichenvon Objekten Übersicht"

Copied!
72
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

2

(2)

Übersicht

§ 9.1 Einleitung

§ 9.2 ArrayList<T>

§ 9.3 Vergleichen von Objekten

3

(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

(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

(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

6

(6)

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

} ....

7

(7)

Von 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!

(8)

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

9

(9)

LinkedPointList

/** * 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

(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

(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

12

(12)

Interfaces

§ 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

(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

(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

(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

(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

§

17

(17)

Linked_irgendein_Typ_List

§ LinkedPointList : Menge von Point Referenzen

§ LinkedShapeList : Menge von Shape Referenzen

§ LinkedStringList : Menge von String s

§ LinkedFileList: Menge von File Referenzen

§

18

(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

19

(19)

LinkedPointList, 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

(20)

22

(21)

25

(22)

Java Collections

(23)

Java Collections

(24)

Java Collections

(25)

Zurück zu unserer Aufgabe

§ Ein genauerer Blick auf Listen

§ und was für Listen von den Collection Klassen angeboten werden

37

(26)

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.

(27)

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

[]

(28)

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

(29)

9.2 ArrayList

41

(30)

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

(31)

43

(32)

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

(33)

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

(34)

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

(35)

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

(36)

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

(37)

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

(38)

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

(39)

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;

} }

52

Dann …

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

(40)

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

53

(41)

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

(42)

55

https://docs.oracle.com/javase/10/docs/api/

java/util/List.html

(43)

56

Später mehr

(44)

57

(45)

58

(46)

59

(47)

60

(48)

61

Später mehr

(49)

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

} }

}

}

62

(50)

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

(51)

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

(52)

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

} }

}

}

66

(53)

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

(54)

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

}

(55)

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

(56)

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

(57)

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

(58)

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

(59)

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

(60)

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

} } }

(61)

ArrayList als Rückgabewert

§ Eine Liste kann auch als Ergebnis zurückgegeben werden:

public static ArrayList<Type> methodName(params)

82

(62)

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

(63)

§ 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

(64)

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

(65)

86

(66)

87

(67)

Was fehlt?

§ Was sind die Attribute?

§ Was würden wir erwarten?

§ Vielleicht ….

88

(68)

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

(69)

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

(70)

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

}

91

(71)

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

}

92

777 333

666

777

(72)

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

Referenzen

ÄHNLICHE DOKUMENTE

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

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

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

(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

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

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

[r]

To reduce the degree of sequence variation between a vaccine strain and circulating viruses, all HIV-1 isolate sequences of particular subtypes listed in HIV