340 likes | 566 Views
Prof. Dr. Fritz Jobst. 2. Ziele. Objekte in beliebiger Anzahl verwaltenObjekte dynamisch hinzufgen und entfernenEffiziente Suche nach ObjektenTrennung der Anwendung von der Implementierung der Verwaltung:Anwendungen mssen nicht gendert werden, wenn sich die Verwaltung der Daten ndert.Wenn d
E N D
1. 1 Objekte mit Java verwalten Im Package java.util zu finden:
Aufbewahren von beliebig vielen Objekten
Effektive Suche nach Objekten
2. Prof. Dr. Fritz Jobst 2 Ziele Objekte in beliebiger Anzahl verwalten
Objekte dynamisch hinzufügen und entfernen
Effiziente Suche nach Objekten
Trennung der Anwendung von der Implementierung der Verwaltung:
Anwendungen müssen nicht geändert werden, wenn sich die Verwaltung der Daten ändert.
Wenn die Verwaltung z.B. schneller oder fehlertoleranter implementiert wird, dann darf sich der Zugriff auf die Objekte nicht ändern!
3. Prof. Dr. Fritz Jobst 3 Probleme bei Feldern wie int[] xx =... Dynamische Änderungen aufwendig:
Größe ändern??
Einfügen von Einträgen??
Löschen von Einträgen??
Suchen wird nicht unterstützt
Abhilfe: Klassen für einfach oder doppelt verkettete lineare Listen, Bäume, etc. selbst schreiben oder
java.util.Arrays-Klasse studieren
Für Objekte: Comparable-Schnittstelle implementieren
4. Prof. Dr. Fritz Jobst 4 Lösungen Collections (Sammlungen) von Objekten
for-Schleife und Iterator zum einheitlichen Durchlaufen von Objekten in Sammlungen
List für sequentielle und direkte Speicherung
Objekte hinten anfügen
Objekte direkt bei Index i ablegen
Objekte der Reihe nach holen
Objekt ab Nr. i holen
Zuordnungen für assoziative Speicherung
Trage Objekt unter einem Namen ein
Suche Objekt mit dem angegebenen Namen
5. Prof. Dr. Fritz Jobst 5 Collections: Listen und Mengen
6. Prof. Dr. Fritz Jobst 6 Zuordnungen mit Map
7. Prof. Dr. Fritz Jobst 7 Collection Eine Collection umfasst eine Gruppe von Objekten, die als Elemente der Sammlung bezeichnet werden.
Die Schnittstelle schreibt nicht vor, dass die Sammlung frei von Duplikaten sein muss.
Es gibt geordnete und ungeordnete Sammlungen.
Im JDK gibt es keine direkten Implementierungen für Collection, nur für Set und List.
Diese Schnittstelle ist der kleinste gemeinsame Nenner aller Sammlungen.
Sie wird zur Weitergabe von Sammlungen eingesetzt, wenn ein Maximum an Abstraktion gesucht wird.
8. Prof. Dr. Fritz Jobst 8 Set und List Set
Ein Set ist eine Menge unterschiedlicher Elemente.
Also: ein Set kann einzelne Elemente nicht doppelt enthalten.
Eine Anordnung ist nicht automatisch damit verbunden.
List
Eine Liste ist eine geordnete Sammlung, die manchmal auch als Folge bezeichnet wird.
Listen dürfen im Gegensatz zu Mengen Duplikate enthalten.
Listen erlauben die genaue Kontrolle über die Reihenfolge der Elemente, auch beim Einsetzen.
Elemente können über ihre Folgenummer in der Liste angesprochen werden.
Java 1: Anwender von Vector sind mit der Funktionalität einer Liste vertraut.
9. Prof. Dr. Fritz Jobst 9 Zuordnungen: Map Ein Map ist eine Zuordnung von Schlüsseln zu Werten.
Schlüssel können nicht doppelt auftreten.
Jeder Schlüssel ist maximal einem Wert zugeordnet.
Java 1 hat die Map-Funktionalität mit der Klasse Hashtable zur Verfügung gestellt.
10. Prof. Dr. Fritz Jobst 10 Anordnung von Objekten in Sammlungen Nur vergleichbare Objekte können angeordnet werden. Das Vergleichskriterium kann nicht von der Sammlung, sondern muss von den Elementen implementiert werden.
Die Comparable-Schnittstelle aus dem Package java.lang liefert eine natürliche Ordnung, während die Comparator-Schnittstelle aus dem Package java.util die präzise Kontrolle ermöglicht.
SortedSet
Ein SortedSet ist eine Menge, bei der die Elemente in aufsteigender Anordnung gehalten werden.
Für solche Mengen bieten sich zusätzliche Operationen an.
SortedMap
Ein SortedMap ist eine Zuordnung, bei der die Schlüssel in aufsteigender Reihenfolge gehalten werden.
Sie bietet sich für Wörterbücher oder Telefonbücher an.
11. Prof. Dr. Fritz Jobst 11 Prinzip: Aufbewahrung von Objekten
12. Prof. Dr. Fritz Jobst 12 Was bewahrt die Sammlung auf? void add (Object obj);
Der OID (Object Identifier) des übergebenen Objekts wird aufgewahrt.
D.h.: Die Referenz (vereinfacht die Adresse) des Objekts wird aufbewahrt.
Die Sammlung agiert wie ein Makler:
Er hat nicht die Häuser in seinem Büro, sondern nur die Adressen.
Object get (.../*Suchbegriff*/ ...);
Die Sammlung liefert auf Anfrage den OID
Bei einer Liste: Index
ArrayList: einen Index
Bei einer Zuordnung (Map): „Suchbegriff“ bzw. „Schlüssel“
HashMap : ein Schlüssel (Oft ein Name)
TreeMap: ein Schlüssel (Oft ein Name)
Auch dies ist wie beim Makler:
Man nimmt keine Häuser mit, sondern Anschriften.
Die Anschrift verbleibt beim Makler.
13. Prof. Dr. Fritz Jobst 13 Was akzeptiert die Sammlung? In keinem Fall :
int, char, boolean, float, double, ...
Also keinen der Wert-Datentypen
Nur Referenz-Typen: Klassen und Felder
Abhilfe: sog. Boxing (=Verpacken) von Werten
In Java <= 4 geht das nicht so:
container.add (5); // Ab Java 5
Sondern so:
Daten elementarer Typen müssen „verpackt“ werden. Nur in der „Verpackung“ können sie aufbewahrt werden.
container.add (new Integer (5));
Java 5 macht dies automatisch: Autoboxing/Unboxing
Aber: nach wie vor bewahren die Collections nur Objekte
14. Prof. Dr. Fritz Jobst 14 Was liefert die Sammlung? Object get (...);
Die Collection liefert stets eine OID eines allgemeinen Objekts (was denn sonst?)
Bearbeitung des Objekts
Nutzung seiner Methoden
I.A. wenig nützlich: außer toString() wird wenig geboten.
Deswegen: Hochcasten auf eine Basisklasse
Z.B. alle meine Objekte in der Collection sind Person
Person p = (Person)sammlung.get (...);
Dann p als Person verarbeiten. Wenn die Person ein Chef ist, dann sorgt die späte Bindung für eine artgerechte Behandlung.
15. Prof. Dr. Fritz Jobst 15 Vorsicht bei der Anwendung Nur z.B. Person(en) oder GeoObjekt(e) in die jeweiligen Container, niemals einen Mix!
Dieses Prinzip ist für alle allgemeinen Dienste von OOP-Sprachen einheitlich.
Zum Thema „Hochcasten“ vgl. nächste Folie.
Die Rettung ist schon da: Java 5
Java 5 bietet generische Sammlungen an.
Dies ist eine Analogie zur STL (Standard Template Library) in C++
16. Prof. Dr. Fritz Jobst 16 Erinnerung an Kapitel 3: Hochcasten
17. Prof. Dr. Fritz Jobst 17 Generische Sammlungen ab Java 5 Das „Hochcasten“ ist unsicher, denn zur Laufzeit kann eine Programmausnahme auftreten.
Deswegen wurden mit Java 5 generische Sammlungen eingeführt.
List<String> namen = new ArrayList<String>();
18. Prof. Dr. Fritz Jobst 18 List und ArrayList: Übersicht Verhalten ähnlich zu einem Feld: Es gibt eine Reihenfolge der Elemente.
Verwaltung von Objekten durch Verwaltung der OIDs.
Aber:
nur Objekte verwalten, keine ints, doubles etc…
Auch wenn man das in Java 5 direkt am Programm nicht mehr sieht (wg. Autoboxing)!
dynamische Änderung der Größe.
Einfügen und Löschen von Objekten möglich.
19. Prof. Dr. Fritz Jobst 19 ArrayList: Konstruktoren ArrayList<Typ>()
Neue Liste mit 10 Plätzen.
ArrayList<Typ> (int n)
Neue Liste mit n Plätzen.
ArrayList (Collection<? extends E> c)
Neue Liste mit Elementen aus der übergebenen Sammlung.
Vorsicht:
Erweiterungen der Liste verursachen einen nicht unerheblichen Aufwand (Umkopieren, Löschen der alten Liste).
Wenn es auf Effizienz ankommt:
Erst den Bedarf planen und dann programmieren.
20. Prof. Dr. Fritz Jobst 20 ArrayList: Anfügen und Einfügen
21. Prof. Dr. Fritz Jobst 21 List: Eintragen eines Elements vom Typ E Die Dienste der List-Schnittstelle müssen von einer Klasse (z.B. ArrayList) implementiert werden.
Ein Element vom Typ E hinten anfügen
boolean add (E e)
Liefert immer true, kann aber Exceptions werfen.
Ein Element vom Typ E einfügen
void add (int index, E e)
Element vom Typ E bei index ersetzen
E set(int index, E e)
Liefert das „alte“ Element an der Position index.
Die Liste wird ggfs. erweitert.
22. Prof. Dr. Fritz Jobst 22 List: Löschen und Zugriff Löschen
E remove (int i)
Das Element am Platz i entfernen.
boolean removeAll(Collection<?> c)
Alle Elemente von c aus der Sammlung entfernen.
void clear()
Alle Objekte entfernen.
Zugriff
Referenz auf Objekt bei Index i holen.
E get (int i)
<E> E[]toArray(E[] a)
Die Referenzen als Array vom Typ E[] holen.
23. Prof. Dr. Fritz Jobst 23 List: Verwalten und Suchen int size()
Anzahl der Elemente im Vektor liefern.
boolean isEmpty()
Enthält der Vektor Elemente?
boolean contains(Object elem)
Ist das Element elem vorhanden?
int indexOf(Object e)
Index des Elements e ermitteln.
Die Suche ist als lineare Suche realisiert.
Damit ist die Laufzeit proportional zur Anzahl der Einträge, d.h. sie empfiehlt sich nicht für größere Felder.
24. Prof. Dr. Fritz Jobst 24 Durchlaufen einer Liste Die Für-Alle-Elemente-tue-Operation wird über Aufzählungen der Elemente realisisiert.
Nützlich: die erweiterte for-Schleife.
List<String> liste = …; // Nun : liste füllen ...
// Jetzt : ausgeben
for (String s : liste)
{
System.out.println(s);
}
25. Prof. Dr. Fritz Jobst 25 Der „Cursor“ bei der Iteration über Listen Der Cursor zeigt nie direkt auf ein Element, immer davor bzw. dahinter bzw. dazwischen.
Der Cursor kann vor- und rückwärts bewegt werden.
boolean hasNext() und E next()
boolean hasPrevious() und E previous()
26. Prof. Dr. Fritz Jobst 26 Beispiel für eine Iteration private List<String> namen = new ArrayList<String>();
// Ausgabe mit der Iterations-Schnittstelle ausgeben
public void print () {
System.out.println ("Iterator:");
for (ListIterator<String> iter = namen.listIterator();
iter.hasNext(); ) {
System.out.print (iter.next());
if (iter.hasNext())
System.out.print (", ");
else
System.out.println ();
}
System.out.println (" Alle Elemente aufgezaehlt\n");
}
27. Prof. Dr. Fritz Jobst 27 Set Ein Set ist als Abbild des Mengenbegriffs der Mathematik eine Collection, bei der jedes Element nur einfach vorhanden ist.
Die Set-Schnittstelle enthält nur Methoden, die von der Collection-Schnittstelle geerbt werden.
Zusätzlich darf ein Set-Objekt keine zwei gleichen Elemente enthalten.
Zwei Set-Objekte gelten als gleich, wenn sie dieselben Elemente enthalten.
28. Prof. Dr. Fritz Jobst 28 Duplikate mit Hilfe von Set suchen import java.util.HashSet;
import java.util.Set;
public class SucheDuplikate {
public static void main(String[] args) {
Set<String> worte = new HashSet<String> ();
for (String wort : args)
if (!worte.add(wort))
System.out.println("Duplikat gefunden : "+wort);
System.out.println(worte.size()+
" = Anzahl der verschiedenen Worte in der Menge: "+worte );
}
}
29. Prof. Dr. Fritz Jobst 29 Probelauf Probelauf mit HashSet:
…>java SucheDuplikate ich kam ich sah ich siegte
Duplikat gefunden : ich
Duplikat gefunden : ich
4 = Anzahl der verschiedenen Worte in der Menge: [siegte, kam, ich, sah]
Wenn man anstelle eines HashSet ein TreeSet benützt, erhält man die Ausgabe:
…>java SucheDuplikate2 ich kam ich sah ich siegte
Duplikat gefunden : ich
Duplikat gefunden : ich
4 = Anzahl der verschiedenen Worte in der Menge:[ich, kam, sah, siegte]
30. Prof. Dr. Fritz Jobst 30 Map: Übersicht Maps verwalten Zuordnungen
Schlüssel (K: Key) <---> Wert (V: Value)
Assoziative Suche
Schlüssel (K: Key) <---> Wert (V: Value)
Objekte können anhand eines Schlüssels gespeichert und gefunden werden.
Der Schlüssel ist oft ein Name (String)
Effiziente Suche mit HashMap
Falls Tabelle nicht zu voll: Pro Zugriff nur wenige Operationen
Speicherung nach einem Hash-Verfahren
d.h. Berechnung des Platzes aus dem Schlüssel, nicht Suche
Sortierte Anordnung mit TreeMap
Aber: Suche dauert länger als bei HashMap
31. Prof. Dr. Fritz Jobst 31 Beispiel: Map, TreeMap import java.util.*;
import java.io.*;
class MapDemo {
private Map <String, Integer> codes =
new TreeMap <String, Integer>();
// Statt TreeMap könnte man auch eine HashMap verwenden.
public MapDemo () {
codes.put ("if", 1);
codes.put ("while", 2);
codes.put ("switch", 3);
codes.put ("do", 4);
codes.put ("for", 5);
}
32. Prof. Dr. Fritz Jobst 32 Ausgabe aller Werte (Values) Bei einer TreeMap-Zuordnung erhält man eine sortierte Ausgabe der Werte.
Sortierkriterium sind die Schlüssel, nicht die Werte.
// Ausgabe aller Werte: durchlaufe alle Werte
public void print () {
System.out.println ("Alle Elemente:");
for (int key: codes.values()) {
System.out.print (key + " ");
}
System.out.println ("Fertig mit allen Elementen");
}
33. Prof. Dr. Fritz Jobst 33 Suche in einer Zuordnung public void search () {
System.out.print ("Eingabe: ");
String s = null;
try {
s = readLine ();
Integer code = codes.get (s);
if (code != null) {
System.out.println ("code: " + code);
} else
System.out.println ("Kein Eintrag fuer " + s
+ " gefunden");
} catch (IOException e) {
e.printStackTrace (System.err);
}
}
34. Prof. Dr. Fritz Jobst 34 Map: Eintragen und Suchen Eintragen
V put(K key, V value)
Das Objekt value wird eingetragen. Es kann unter dem angegebenen Schlüssel key gefunden werden
Suchen
boolean containsValue(Object value)
boolean containsKey(Object key)
V get(K key)
35. Prof. Dr. Fritz Jobst 35 Zuordnungen: Anlegen, Löschen, Verwalten Anlegen HashMap K = KeyType, V = ValueType
new HashMap<K,V> ()
neue Hashtable mit loadFactor = 0.75
new HashMap<K,V> (int n)
neue Hashtable mit n Plätzen und loadFactor = 0.75
new HashMap<K,V> (int n, float loadFactor)
neue HashMap mit n Plätzen und dem angegebenen Füllgrad loadFactor.
Anlegen TreeMap
new TreeMap<K,V> ()
Löschen
V remove(Object key)
Lösche das Objekt mit dem Schlüssel key. Liefert das Objekt zurück
void clear()
Lösche alle Objekte
Verwalten
int size()
Anzahl der Zuordnungen
boolean isEmpty()
Gibt es Zuordnungen?
Beispiel: k04/src/MapDemo.java