Algorithmen und Datenstrukturen in Java 2007 Jiri Spale, Algorithmen und Datenstrukturen in Java 1 Enumeratoren und Iteratoren Daten üblich gespeichert in: Arrays, verketteten Listen, Bäumen, … Geläufige Aufgaben: Gehört das Datum D dazu? Daten durchwandern Bedarf: ein einheitlicher Mechanismus für Grundaufgabentypen Problem 1: Programmiermechanismen zur Erledigung obiger Aufgaben bei jedem Typ der Datenstruktur anders. Problem 2: Im OOP sind die internen Datenstrukturen nicht zugänglich Lösung: Enumeratoren, Iteratoren 2007 Jiri Spale, Algorithmen und Datenstrukturen in Java 2 Interface Enumeration 2 Funktionen zum Iterieren durch eine Datenstruktur: • hasMoreElements() … Abfrage, ob Ende • nextElement() … liefert das nächste Element; zurück oder gezielt geht nicht Bsp. Bauernregeln 2007 Jiri Spale, Algorithmen und Datenstrukturen in Java 3 Klasse Vector • • • • • • Intern als Array implementiert Ein vorhandenes Array wird bei Bedarf durch ein größeres Array ersetzt Zugriff über Indizes Operator [] unbekannt Methoden akzeptieren Index als ein Parameter Vector-Elemente: Instanzen aller von Object abgeleiteten Klassen - Mischung von Datentypen erlaubt - Konsequenz: Programmierer muss wissen, welche Typen er drin hat - Konsequenz 2: primitive Datentypen nicht als Element erlaubt (Bsp. Vector) 2007 Jiri Spale, Algorithmen und Datenstrukturen in Java 4 Klasse Vector: Konstruktoren 1. Vector() leer, Anfangskapazität 10 Elms 2. Vector(int kapazität) leer, Anfangskapazität kapazität Elms 3. Vector(int kapazität, int kapazitätZuwachs) leer, Anfangskapazität kapazität Elms, falls erschöpft, Erhöhung um kapazitätZuwachs 4. Vector(Collection xxx) Collections kommen später 2007 Jiri Spale, Algorithmen und Datenstrukturen in Java 5 Klasse Vector: Methoden #1 • • • • • • • • • • • • • • void addElement(Object o) int capacity() Object clone() … „flache“ Kopie, Original und Kopie referenzieren dieselben Element-Objekte boolean contains(Object o) void copyInto(Object array[]) … Vector → array Enumeration elements() … gibt ein Aufzählungsobjekt zurück Object firstElement() Object elementAt(int index) Object lastElement() int indexOf(Object o) int indexOf(Object o, int index) … ab index int lastIndexOf(Object o) int lastIndexOf(Object o, int index) … rückwärts boolean isEmpty() 2007 Jiri Spale, Algorithmen und Datenstrukturen in Java 6 Klasse Vector: Methoden #2 • • • • • • • • • void insertElementAt(Object o, int index) … fügt o an der Stelle index void removeAllElements() boolean removeElement(Object o) void removeElementAt(int index) void setElementAt(Object o, int index) … o ersetzt Elm an der Stellen index void setSize(int size) … neue Größe; überzählige Elms entfernt int size() (v.size() <= v.capacity() ) String toString() … Vector → String - textuelle Repräsentation der Elms void trimToSize() … capacity wird der size angepasst 2007 Jiri Spale, Algorithmen und Datenstrukturen in Java 7 Klassische Datenstrukturen in Java • Klasse Stack Bsp, intern Vector • Queue … es gibt keine Klasse in Java Bsp: Implementierung basierend auf Vector Nachteil: funktioniert, aber nicht schnell • Klasse Hashtable • Collection API 2007 Jiri Spale, Algorithmen und Datenstrukturen in Java 8 Klasse Hashtable • • • • Schlüssel-Wert-Paare Hashfunktion in Java: Aufsummierung von Zeichen Kollisionsfunktion in Java: verkettete Liste (gestreute Verkettung) Dynamisches Hashing mit automatischen Rehash: - Ist ein gegebener Füllgrad (Java-Termin: Füllfaktor) überschritten, verlängert sich die Tabelle und wird neu berechnet (rehash) - Ist die neue Hashtabelle fertig, wird die alte gelöscht => ab und zu Zeitverzögerungen - Der Zeitpunkt von Rehash kann nicht -- erzwungen werden -- vorhergesagt werden 2007 Jiri Spale, Algorithmen und Datenstrukturen in Java 9 Hashtable: Konstruktoren 1. Hashtable() Anfangskapazität 118 Einträge, Füllfaktor 0.75 (=75%) 2. Hashtable(int initialCapacity) Anfangskapazität lt. Vorgabe, Füllfaktor 0.75 (=75%) 3. Hashtable(int initialCapacity, float loadFactor) beide Parameter: Vorgabe IllegalArgumentException - bei zu kleiner initialCapacity bzw. zu großem loadFactor 2007 Jiri Spale, Algorithmen und Datenstrukturen in Java 10 Hashtable: Methoden#1 • Object put (Object key, Object value) key, value ≠ null Falls key bereits belegt, wird value überschrieben und der alte Wert zurückgegeben. Falls key nicht belegt, Rückgabe null • Object get (Object key) Rückgabe: Wert oder null • • boolean contains (Object value) boolean contains (Object key) Die Suche nach Keys geht viel schneller als die Suche nach Values: Berechnung der Hash-Funktion vs. Durchlaufen aller Listen 2007 Jiri Spale, Algorithmen und Datenstrukturen in Java 11 Hashtable als Enumerator: Methoden#2 Enumeration keys() liefert eine Aufzählung von Schlüsseln • Enumeration elements() liefert eine Aufzälung der Werte Beide sind synchronized – kein neues Einfügen/Löschen möglich bevor fertig • • • • • String toString Zeichenkette mit Teilstrings in der Form Schlüssel = Wert boolean equals (Object o) Vergleich zweier Hashtabellen int hashCode() Die ganze Hashtabelle wird als ein Objekt betrachtet. hashCode liefert den Hashcode für die ganze Tabelle. Benutzung: wenn eine Hashtabelle selbst als Schlüssel benutzt werden soll. clone() Erstellt Kopie einer Hashtabelle. Die Werte selbst werden nicht geklont. 2007 Jiri Spale, Algorithmen und Datenstrukturen in Java 12 Collection API Container = Collection Interface Collection • gemeinsamer äußerer Rahmen • gemeinsame Operationen zum Hinzufügen, Löschen, Selektieren, Finden Erweiterungen (Unterschnittstellen): • BeanContext • BeanContextServices • List • Set • SortedSet 2007 Jiri Spale, Algorithmen und Datenstrukturen in Java 13 Collection API:Methoden • • • • • • • • • • • • boolean add (Object o) boolean addAll(Collection c) void clear() boolean contains (Object) boolean containsAll(Collection c) boolean equals(Object o) int hashCode() boolean isEmpty() Iterator iterator() int size() object[] toArray() object[] toArray (Object a[] ) 2007 Jiri Spale, Algorithmen und Datenstrukturen in Java 14 Collection API: Algorithmen • • • • • • void reverse() Reihenfolge der Elemente wird umgedreht void fill() Belegung mit gleichem Wert void Copy(List dest, List src) Object min(Collection Coll) Object max(Collection Coll) Sort(List list) Merge-Sort 2007 Jiri Spale, Algorithmen und Datenstrukturen in Java 15