1 / 34

Objekte mit Java verwalten

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

wren
Télécharger la présentation

Objekte mit Java verwalten

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


    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

More Related