Collections des Typs Set. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 09: Collections 3. Collections des Typs Set.

Ähnliche Dokumente
JAVA KURS COLLECTION

equals und hashcode SortedSet NavigableSet Assoziative Container Programmieren II Dr. Klaus Höppner Hochschule Darmstadt Sommersemester / 32

4.4.9 Das Java Collection Framework

Java Generics & Collections

Java Einführung Collections

Schnittstellen implementieren am Beispiel Suchbaum

Bäume. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 10: Collections 4. Inhalt. Bäume. Einführung. Bäume.

Vorlesung 09: Mengen. Peter Thiemann SS 2010

Java Schulung. Objektorientierte Programmierung in Java Teil V: Die Java Collection Klassen. Prof. Dr. Nikolaus Wulff

Grundkonzepte java.util.list

Datenstrukturen in Java

Teil V. Generics und Kollektionen in Java

Vorlesung Programmieren

1 Polymorphie (Vielgestaltigkeit)

Objektorientierte Programmierung

Algorithmen und Datenstrukturen

Kapitel 6. Vererbung

Kapitel 6. Vererbung

Grundlagen der Informatik Generische Klassen

Kapitel 6. Vererbung

Algorithmen und Datenstrukturen in Java Jiri Spale, Algorithmen und Datenstrukturen in Java 1

Studentische Lösung zum Übungsblatt Nr. 7

Gebundene Typparameter

3 Objektorientierte Konzepte in Java

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Der linke Teilbaum von v enthält nur Schlüssel < key(v) und der rechte Teilbaum enthält nur Schlüssel > key(v)

Programmieren in Java

3 Objektorientierte Konzepte in Java

Objektorientierte Programmierung

Objektorientierte Programmierung

Java: Vererbung. Teil 3: super()

Dr. Monika Meiler. Inhalt

Vererbung & Schnittstellen in C#

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Vererbung. Vererbung von Methoden und Instanzvariablen. Vererbung als Realisierung einer is-a Beziehung.

Verkettete Listen. Implementierung von einfach verketteten Listen. Implementierung von doppelt verketteten Listen

8 Baum in perfekter Komposition

PIWIN 1 Übung Blatt 5

Java Einführung Abstrakte Klassen und Interfaces

Probeklausur: Programmierung WS04/05

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

Programmierkurs Java

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

VIII: Vererbung. Unterklassen einer Klasse. Vererbung von Methoden und Instanzvariablen. Überschreiben von Methoden

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 13. Bäume. Bäume

5 Projekt Bankverwaltung

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

Einführung in die Programmierung

7. Kapitel COLLECTIONS. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

Einstieg in die Informatik mit Java

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Javakurs zu Informatik I. Henning Heitkötter

von Anja Austermann Drag and Drop

Abschnitt 9: Schnittstellen: Interfaces

Einführung in die Informatik 2

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Inhaltsverzeichnis. Praktikum Algoritmen und Datenstrukturen WS2004/2005 Paul Litzbarski Stefan Nottorf. Druckmanager allgemein 2.

Einführung in die Java- Programmierung

Versuchsziele Kenntnisse in der Anwendung von: Sortieren mit Klassen Benutzung von generischen Klassen o Definition o Sortierung.

Tutoraufgabe 1 (2 3 4 Bäume):

Software Engineering Klassendiagramme Assoziationen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 7. Grafische Benutzeroberflächen

Java Schulung (Java 2 Java Development Kit 5 / 6)

Vererbung. Martin Wirsing. Ziele. Vererbung

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Programmieren in Java

Probeklausur: Programmierung WS04/05

Aufgabenblatt Nr. 5 Generizität und TicTacToe

Informatik 11 Kapitel 2 - Rekursive Datenstrukturen

Übungsaufgaben: 1. Objektorientierte Programmierung - Teil 1

Betreutes Programmieren Vorlesung Informatik II, Blatt 7 Musterlösung

Repetitorium Informatik (Java)

Distributed Computing Group

Wiederholung ADT Menge Ziel: Verwaltung (Finden, Einfügen, Entfernen) einer Menge von Elementen

2. Vererbung und Polymorphie. Vererbung (1/2) Beispiel (1/2) Vererbung (2/2) Eine Unterklasse wird folgendermaßen definiert

3. Konzepte der objektorientierten Programmierung

BTree.dll - Balancierte und verkettete Bäume. Ecofor. BTree.dll. Realisiert mit Microsoft Visual Studio /9

Java-Implementierung der Priority-Queue und des Huffman-Algorithmus Effiziente Algorithmen SS12 Übung 4 Aufgabe 5 Johannes Hein

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

5.4 Klassen und Objekte

C# im Vergleich zu Java

Überschreiben von Methoden

i n g e n i e u r b ü r o f ü r s o f t w a r e t e c h n o l o g i e w w w. v o e l t e r. d e Servlet Debugging

Theorie zu Übung 8 Implementierung in Java

Willkommen zur Vorlesung. Objektorientierte Programmierung Vertiefung - Java

einkonto.zahle(+100); //Transaktion Einzahlung einkonto.zahle(-20); //Transaktion Auszahlung einkonto.zahle(+30); //Transaktion Einzahlung

Prof. W. Henrich Seite 1

Repetitorium Informatik (Java)

Objektorientierte Programmierung. Kapitel 12: Interfaces

Einführung in die Programmierung Vorlesungsprüfung

Folge 18 - Vererbung

Thread-Synchronisation in in Java. Threads Wechselseitiger Ausschluss Bedingte Synchronisation Beispiel: Warteschlangen

Aufgabe 1 (12 Punkte)

Programmierkurs Java

Objektorientierte Softwareentwicklung

Algorithmen und Datenstrukturen 07

5.14 Generics. Xiaoyi Jiang Informatik I Grundlagen der Programmierung

Java für Computerlinguisten

Transkript:

Universität Osnabrück 1 3 - Objektorientierte Programmierung in Java Vorlesung 09: Collections 3 Eigenschaften Eine Collection vom Typ Set ist die Java- Repräsentation einer mathematischen Menge. Sie enthält keine doppelten Elemente (Nutzdaten), d.h. es darf zu keinem Zeitpunkt zwei Elemente a und b geben, für die a.equals(b) wahr ist. Die Elemente eines Sets haben keine definierte Reihenfolge. Sie kann sich durch das Einfügen und Löschen von Elementen im Laufe der Zeit ändern. SS 2006 Prof. Dr. F.M. Thiesing, FH Osnabrück Inhalt 2 4 Collections des Typs Sortierte Collections Sortierte Sortierte Collections des Typs Anmerkung In allen Collections der Java-Bibliothek werden nur Verweise auf bereits vorher existierende Objekte gespeichert. Besondere Vorsicht ist geboten, wenn ein Set dazu benutzt wird, veränderliche (engl. mutable) Objekte zu speichern. Wird ein Objekt, das bereits in einem Set gespeichert ist, anschließend so verändert, dass der equals- Vergleich mit einem anderen Element des Sets wahr ist, so gilt das gesamte Set als undefiniert und darf nicht mehr benutzt werden.

5 7 Operationen Eine Collection vom Typ Set<E> besitzt alle Operationen einer allgemeinen Collection, insbesondere auch die typischen Mengenoperationen: Einfügen aller Objekte einer zweiten Collection (Vereinigung) boolean addall(collection<? extends E> c) Entfernen aller Objekte einer zweiten Collection (Mengendifferenz) boolean removeall(collection<?> c) Beibehalten aller Elemente, die in einer zweiten Collection enthalten sind bzw. Entfernen aller Elemente, die nicht in der zweiten Collection enthalten sind (Durchschnitt) boolean retainall(collection<?> c) Implementierungen Abstrakte Basisklasse AbstractSet<E>: dient als Basisklasse für eigene Set-Implementierungen Klasse HashSet<E>: implementiert die Menge mit Hilfe einer Hash-Tabelle (siehe s) Vor jedem Einfügen wird geprüft, ob das einzufügende Element bereits in der Hash-Tabelle enthalten ist. Klasse TreeSet<E>: siehe Sortierte Collections 6 Bsp: Lottotip.java 8 Klassenhierarchie Interfaces Collection Set SortedSet (Abstrakte) Klassen AbstractCollection AbstractSet HashSet TreeSet public static void main(string[] args) Set<Integer> set = new HashSet<Integer>(10); int doubletten = 0; //Lottozahlen erzeugen while (set.size() < 6) int num = (int)(math.random() * 49 + 1.5); if (!set.add(num)) ++doubletten; //Lottozahlen ausgeben for (int zahl : set) System.out.println(zahl); System.out.println("Ignorierte Doubletten: " + doubletten); SortedSet<Integer> ts = new TreeSet<Integer>(); ts.addall(set); for (int zahl : ts) System.out.println(zahl);

9 11 Eigenschaften Eine realisiert einen assoziativen Speicher, der Schlüssel auf Werte abbildet. Eine solche Struktur, bei der Paare mit dem Aufbau (Schlüssel,Wert) gespeichert werden, wird in der Informatik auch als Wörterbuch bezeichnet. Bei den s der Java-Klassenbibliothek sind sowohl die Schlüssel als auch die Werte Objekte einer beliebigen Klasse. Je Schlüssel gibt es entweder keinen oder genau einen Eintrag in der. Interface <K, V> Das Interface ist nicht von Collection abgeleitet. Die Operationen size, isempty und clear entsprechen jedoch den gleichnamigen Operationen aus Collection. Entfernen von Elementen Das Entfernen eines Paares zu einem Schlüssel erfolgt mit der Operation V remove(object key) Als Ergebnis wird der gespeicherte Wert zurückgegeben, wenn der Schlüssel enthalten war, ansonsten null. 10 12 Klassenhierarchie Interfaces HashTable Sorted (Abstrakte) Klassen Abstract Hash Tree Einfügen von Elementen Das Einfügen eines Paares (Schlüssel, Wert) erfolgt mit der Operation V put(k key, V value) Ist der Schlüssel bereits enthalten, wird der alte Wert durch den neuen Wert ersetzt. Als Ergebnis wird der alte Wert zurückgegeben, wenn der Schlüssel enthalten war, ansonsten null. Die Operation void putall(<? extends K,? extends V> t) fügt alle Paare aus t ein.

13 15 Zugriff auf Elemente Der Zugriff auf einen Wert über den ihm zugeordneten Schlüssel erfolgt mit der Operation V get(object key) Die Operation liefert den zu key gehörenden Wert oder null, falls kein Paar mit dem Schlüssel key enthalten ist. Die Operation liefert auch dann null als Ergebnis, wenn es erlaubt ist, null als Wert einzutragen. In diesem Fall kann die Operation containskey benutzt werden, um die beiden Fälle zu unterscheiden. Zur Überprüfung, ob ein bestimmter Schlüssel oder ein bestimmter Wert enthalten ist, gibt es zwei Operationen: boolean containskey(object key) boolean containsvalue(object value) Set<.Entry<K, V>> entryset() liefert eine Menge von Paaren (Schlüssel, Wert). Jedes Element dieser Menge ist vom Typ.Entry, Auf ein Objekt vom Typ.Entry<K, V> können folgende Operationen angewandt werden: K getkey() liefert den Schlüssel des Eintrags als Ergebnis V getvalue() liefert den Wert des Eintrags als Ergebnis V setvalue(v value) setzt den Wert des Eintrags 14 16 Sichten (engl. views) Im Vergleich zum Collection-Interface fällt auf, dass eine keine Operation iterator besitzt, um einen Iterator für den sequentiellen Durchlauf zu erzeugen. Stattdessen kann sie drei unterschiedliche Collections, sog. Sichten, erzeugen, die dann ihrerseits dazu verwendet werden können, einen Iterator zu liefern: Set<K> keyset() liefert die Menge aller Schlüssel. Da per Definition keine doppelten Schlüssel in einer enthalten sind, ist das Ergebnis vom Typ Set. Collection<V> values() liefert alle Werte der. Da Werte doppelt enthalten sein können, ist der Rückgabewert lediglich vom Typ Collection. Sichten (Hinweis) Die von keyset, value und entryset gelieferten Collections enthalten Verweise auf die Inhalte der. Änderungen in der wirken sich auf diese Collections aus und umgekehrt. Wird die modifiziert während ein Iterator die Collection bearbeitet, sind die Ergebnisse dieses Iterators undefiniert. Die Collections unterstützen das Löschen von Elementen, das das korrespondierenden Paar aus der löscht: Iterator.remove, Collection.remove, removeall, retainall und clear. Nicht unterstützt: add, addall

17 19 Implementierungen Abstrakte Basisklasse Abstract<K, V>: dient als Basisklasse für eigene -Implementierungen Klasse Hash<K, V>: implementiert das Interface mit Hilfe einer Hash-Tabelle Klasse Hashtable<K, V>: Seit dem JDK 1.2 implementiert die Klasse Hashtable ebenfalls das Interface. Im Gegensatz zur Hash ist es nicht erlaubt, null-werte einzutragen. Die wichtigen Operationen sind synchronisiert. Klasse Tree<K, V>: siehe Sortierte Collections Wichtige Parameter einer Hash-Tabelle in Java sind: Kapazität: Anzahl der Elemente, die insgesamt in der Hash- Tabelle untergebracht werden können Ladefaktor: zeigt an, bei welchem Füllungsgrad die Hash- Tabelle vergrößert werden muss Das Vergrößern der Tabelle erfolgt automatisch, wenn die Anzahl der Elemente innerhalb der Tabelle größer ist als das Produkt aus Kapazität und Ladefaktor. 18 20 Hash-Verfahren (dt.: gestreute Speicherung) Eine Hash-Tabelle benutzt das Verfahren der Schlüsseltransformation, d.h. es wird eine Transformationsfunktion (auch Hash-Funktion genannt) zur Abbildung von Schlüsseln auf Indexpositionen eines Feldes verwendet. Ziel ist es, die Transformationsfunktion durch möglichst einfache arithmetische Operationen zu realisieren und eine gleichmäßige Streuung der Einträge in der Tabelle zu erzielen. Zur Auflösung von Kollisionen in der Tabelle gibt es verschiedene Strategien. Eigenschaften von Schlüssel-Objekten Damit die Objekte einer Klasse als Schlüssel für eine Hash-Tabelle benutzt werden können, muss die Klasse zwei Operationen zur Verfügung stellen: public boolean equals(object o) public int hashcode() Werden die Operationen equals und hashcode von einer Klasse nicht zur Verfügung gestellt, werden die entsprechenden Operationen der Oberklasse benutzt. Stellt keine der Oberklassen die Operationen zur Verfügung, werden die Operationen der Klasse Object benutzt.

21 Sortierte Collections 23 Eigenschaften der Operationen der Klasse Object: Die Implementierung der Operation equals überprüft die Referenzgleichheit zweier Objekte nicht die Inhaltsgleichheit, und ist damit im allgemeinen nicht für die Nutzung in einer Hash- Tabelle geeignet. Die Implementierung der Operation hashcode garantiert nur, dass mehrfache Aufrufe der Operation für ein (referenz-) gleiches Objekt den gleichen Hashcode liefern. Für zwei inhaltsgleiche Objekte wird der Hashcode im allgemeinen verschieden sein. Daher sollten in jeder Klasse, deren Objekte als Schlüssel für eine Hash-Tabelle benutzt werden sollen, diese beiden Operationen überschrieben, d.h. neu programmiert werden. Es muss gelten: Sind zwei Objekte bzgl. equals gleich, muss hashcode für sie denselben Hashcode liefern. Die Set-Collection vom Typ HashSet ist unsortiert, d.h. ihre Iteratoren geben die Elemente in keiner bestimmten Reihenfolge zurück. Die Collections der Sichten auf die s vom Typ Hash und Hashtable sind ebenfalls unsortiert. Im Gegensatz dazu speichern die Collection vom Typ TreeSet und Tree ihre Elemente in einer sortierten Reihenfolge. Bsp: MailAlias.java 22 Sortierte Collections 24 public static void main(string[] args) <String,String> h = new Hash<String,String>(); //Aufbau der Aliase h.put("fritz","f.mueller@test.de"); h.put("franz","fk@b-blabla.com"); h.put("paula","user0125@mail.uofm.edu"); h.put("lissa","lb3@gateway.fhdto.northsurf.dk"); //Ausgabe Set<.Entry<String,String>> set = h.entryset(); // Sicht Iterator<.Entry<String,String>> it = set.iterator(); while (it.hasnext()).entry<string,string> entry = it.next(); System.out.println( entry.getkey() + " --> " + entry.getvalue() ); Sortierung Standardmäßig erfolgt die Sortierung der Elemente nach ihrer natürlichen Ordnung. Dazu muss sichergestellt werden, dass alle Objekte, die in einer sortierten Collection gespeichert werden, eine compareto-operation besitzen je zwei beliebige gespeicherte Objekte miteinander verglichen werden können, ohne dass es zu einem Typfehler kommt. Die Klassen der Objekte müssen also das Interface Comparable implementieren, welches die Operation public int compareto(object o) definiert.

Sortierte 25 Sortierte 27 Zur Realisierung von sortierten Mengen wurde aus Set<E> das Interface SortedSet<E> abgeleitet. Es erweitert das Interface Set um folgenden Operationen: Zugriff auf das bezüglich der Sortierordnung erste bzw. letzte Element der Menge: E first() E last() Implementierung Klasse TreeSet<E>: implementiert die sortierte Menge mit Hilfe der Klasse Tree Die einzufügenden Objekte werden vollständig als Schlüssel betrachtet. Das zugehörige Wert-Objekt ist für alle Schlüssel identisch. Sortierte 26 Bsp: Früchte.java 28 Erzeugung von Teilmengen der Originalmenge auf Basis der Sortierung: SortedSet<E> headset(e toelement) alle Elemente, die echt kleiner als das als Argument übergebene Objekt sind SortedSet<E> tailset(e fromelement) alle Elemente, die größer oder gleich dem als Argument übergebenen Objekt sind SortedSet<E> subset(e fromelement, E toelement) alle Elemente, die größer oder gleich fromelement und echt kleiner als toelement sind import java.util.sortedset; import java.util.treeset; public class Fruechte public static void main(string[] args) //Konstruieren des Sets SortedSet<String> s = new TreeSet<String>(); s.add("kiwi"); s.add("kirsche"); s.add("ananas"); s.add("zitrone"); s.add("grapefruit"); s.add("banane"); for (String st: s) System.out.println(st);

Sortierte 29 Sortierte 31 Zur Realisierung von sortierten s wurde aus <K, V> das Interface Sorted<K, V> abgeleitet. Es erweitert das Interface <K, V> um folgende Operationen, die analog zu den Operationen von SortedSet<E> definiert sind: K firstkey() K lastkey() Sorted<K, V> head(k tokey) Sorted<K, V> tail(k fromkey) Sorted<K, V> sub(k fromkey, K tokey) Iteratoren Die Operationen keyset und entryset angewandt auf eine Sorted liefern Collections vom Typ Set, deren Iteratoren ihre Elemente in aufsteigender Reihenfolge abliefern. Sortierte 30 Sortierte 32 Sortierung Die Sortierung der Elemente in einer Sorted erfolgt standardmäßig entsprechend der natürlichen Ordnung der Schlüssel. Eine Klasse, deren Objekte als Schlüssel benutzt werden sollen, muss das Interface Comparable implementieren. Implementierungen Klasse Tree<K, V>: Datenstruktur Als Datenstruktur wird ein Rot-Schwarz-Baum benutzt. Der Rot-Schwarz-Baum ist ein balancierter Baum, d.h. spezielle Einfüge- und Löschoperationen stellen sicher, dass der Baum nicht zu einer linearen Liste entartet.

Comparable vs. 33 Beispiel mit Comparator 35 Seit dem JDK 1.2 wird das Comparable- Interface bereits von vielen der eingebauten Klassen implementiert, etwa von String, Character, Double usw. Die natürliche Ordnung einer Menge von Elementen ergibt sich nun, indem man alle Elemente paarweise miteinander vergleicht und dabei jeweils das kleinere vor das größere Element stellt mit compareto(). TreeTestTest TreeTest.java Verwaltet 2-dimensionale Punkte und sortiert diese gemäß zwei unterschiedlichen Comparatoren Point.java 2-dimensionaler Punkt mit Bezeichnung, z.b.: Nr. 1 (3,4) EuklidPointComparator.java Bestimmt den Abstands eines Punktes zum Ursprung nach euklidischer Norm. DeltaXComparator.java Vergleicht zwei Objekte anhand ihres X-Abstandes zum Ursprung. java.util.comparator 34 Beispiel mit Comparator 36 Die zweite Möglichkeit, eine Menge von Elementen zu sortieren, besteht darin, an den Konstruktor der Collection-Klasse ein Objekt des Typs Comparator zu übergeben. Comparator ist ein Interface, das lediglich eine einzige Methode compare definiert: public int compare(object o1, Object o2) Das übergebene Comparator-Objekt übernimmt die Aufgabe einer»vergleichsfunktion«, deren Methode compare immer dann aufgerufen wird, wenn bestimmt werden muss, in welcher Reihenfolge zwei beliebige Elemente zueinander stehen. TreeSet kann Comparables einfügen und verwalten. Alternativ kann aber ein Comparator entsprechenden Typs angegeben werden, um die Elemente zu sortieren. Die Objekte müssen also nicht mehr von Typ Comparable sein. Die Implementation mit einem Comparator ist elegant, da dieser leicht ausgetauscht werden kann und auch von jemandem implementiert werden kann, der keinen (Programmier-) Zugriff auf die einzufügenden Objekte besitzt.