ALP II Dynamische Datenmengen

Ähnliche Dokumente
ALP II Dynamische Datenmengen Datenabstraktion (Teil 2)

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Bäume. Text. Prof. Dr. Margarita Esponda SS 2012 O4 O5 O6 O ALP2-Vorlesung, M. Esponda

! 1. Rekursive Algorithmen.! 2. Rekursive (dynamische) Datenstrukturen. II.3.2 Rekursive Datenstrukturen - 1 -

Programmierkurs Java

ALP II Dynamische Datenmengen Datenabstraktion

Programmieren I. Kapitel 13. Listen

Datenstrukturen und Abstrakte Datentypen

3. Übungsbesprechung Programmkonstruktion

Stacks, Queues & Bags. Datenstrukturen. Pushdown/Popup Stack. Ferd van Odenhoven. 19. September 2012

ADT: Verkettete Listen

Grundkonzepte java.util.list

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

II.3.1 Rekursive Algorithmen - 1 -

Programmieren 2 Übung Semesterwoche 2

Innere Klassen. Innere Klassen. Page 1. Lernziele: innere Klassen, statische geschachtelte Klassen, anonyme Klassen.

Arten des universellen Polymorphismus

OOP. Tagesprogramm. Generizität

Hochschule Augsburg, Fakultät für Informatik Name:... Prüfung "Programmieren 1", IN1bac, WS 10/11 Seite 1 von 6

Java I Vorlesung Collections

Einstieg in die Informatik mit Java

Gliederung. 5. Compiler. 6. Sortieren und Suchen. 7. Graphen

12. Dynamische Datenstrukturen

Programmieren 2 Java Überblick

Lineare Datenstrukturen: Felder, Vektoren, Listen Modelle: math. Folge (a i ) i=1.. mit Basistyp T oder: [T]

Arten des universellen Polymorphismus

Arten des universellen Polymorphismus

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2014 / Vorlesung 10, Donnerstag 8.

Algorithmen und Datenstrukturen (für ET/IT)

7.0 Arbeiten mit Objekten und Klassen

Programmierkurs Java

public interface Stack<E> { public void push(e e); public E pop();

Programmieren 2 16 Java Collections und Generizität

Vorlesung Programmieren

Algorithmen und Datenstrukturen (für ET/IT) Wiederholung: Ziele der Vorlesung. Wintersemester 2012/13. Dr. Tobias Lasser

4.4.1 Implementierung vollständiger Bäume mit Feldern. Reguläre Struktur: Nachfolger des Knoten i sind die Knoten 2*i und 2*i+1.

Interfaces und Generics

4. Algorithmen und Datenstrukturen I Grundlagen der Programmierung 1 (Java)

Abstrakte Datentypen und Java

Algorithmen und Datenstrukturen

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 14. Bäume. Bäume 1

Aufgaben NF 11; Seite 1

Teil V. Generics und Kollektionen in Java

Vorlesung Inf-B

Kapitel 3: Datentyp Liste

Problem: Was ist, wenn der Stapel voll ist? Idee: Erzeuge dynamisch ein grösseres Array und kopiere um. Dynamische Anpassung der Größe

3. Übungsblatt zu Algorithmen I im SoSe 2017

ListElement (E i n f o, ListElement<E> prev, ListElement<E> next ) {

Vorlesung Datenstrukturen

Algorithmen und Datenstrukturen. Übersicht. Interfaces und Generics. InsertionSort für Punkte. InsertionSort für Punkte

JAVA KURS COLLECTION

Kapitel 12: Induktive

12 Abstrakte Klassen, finale Klassen und Interfaces

Teil IV. Grundlegende Datenstrukturen

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Kapitel 7: Java Collection Teil I

Algorithmen und Datenstrukturen

Objektorientierte Programmierung

Entwurfsmuster - Iterator

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete. II.4.2 Abstrakte Klassen und Interfaces - 1 -

Vorlesung Programmieren

Einfach verkettete Liste

Verkettete Datenstrukturen: Listen

Info B VL 14: Java Collections/Reflections

class ListElement { int value; ListElement next; ListElement() { next=null; value=0;

// Objekt-Methoden: public void insert(int x) { next = new List(x,next); } public void delete() { if (next!= null) next = next.next; } public String

Programmiertechnik II Klausur WS 15/16 Angewandte Informatik Bachelor

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

Abgabe: (vor 12 Uhr)

3 Dynamische Datenstrukturen

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

Institut für Programmierung und Reaktive Systeme 17. Juli Programmieren II. Übungsklausur

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

Programmieren 2 Java Überblick

Institut für Programmierung und Reaktive Systeme 7. Juli Programmieren II. Übungsklausur

XIII: Verkettete Listen

Schnittstellen, Stack und Queue

Algorithmen und Programmierung II

Objektorientierte Programmierung Studiengang Medieninformatik

13. Bäume: effektives Suchen und Sortieren

Übergang von funktionaler zu OOP. Algorithmen und Datenstrukturen II 1

Programmieren II. Hierarchie von Collections. Vorlesung 3. Handout S. 1. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester 2010

Objektorientierte Programmierung

Klausur Sommersemester 2012 Datenstrukturen und Algorithmen 24. September 2012

Objektorientierte Programmierung. Kapitel 14: Interfaces

Geordnete Binärbäume

II.4.5 Generische Datentypen - 1 -

Klausur: Java (Liste P)

Aufgabe 1 (Programmanalyse, Punkte)

Objektorientierte Programmierung

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. )

5. Behälter und Iteratoren. Programmieren in C++ Überblick. 5.1 Einleitung. Programmieren in C++ Überblick: 5. Behälter und Iteratoren

Übung 4: Die generische Klasse AvlBaum in Java 1

16. Dezember 2004 Dr. M. Schneider, P. Ziewer

Kapitel 9. Inner Classes. 9.1 Wiederholung: Iteratoren. Ausführen einer Operation auf allen Elementen einer Containerklasse

Programmieren in C++ Überblick

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

Schein-/Bachelorklausur Teil 2 am Zulassung: Mindestens 14 Punkte in Teilklausur 1 und 50% der Übungspunkte aus dem 2. Übungsblock.

Transkript:

ALP II Dynamische Datenmengen Teil III Iteratoren Iterator-Objekt O1 O2 O3 O4 SS 2012 Prof. Dr. Margarita Esponda 22. ALP2-Vorlesung, M. Esponda 2

Motivation: Iteratoren Wir haben für die Implementierung dynamischer Datenmengen mittels verketteter Listen einen current-zeiger als Teil unserer Listen-Objekte verwendet, der sich durch die Liste bewegen kann und diese Position für weitere Operationen bereitstellt. head current current current tail Wie viele currents? Dummy O1 O2 O2 Dummy Oft müssen wir für bestimmte Algorithmen mehr als eine Position in einer dynamischen Datenmenge gleichzeitig festhalten. 22. ALP2-Vorlesung, M. Esponda 3

Iteratoren Motivation: Wenn wir den Benutzern unserer Klassen erlauben, beliebige solcher Zeiger selber zu definieren und dadurch direkten Zugriff auf die interne Struktur einer dynamischen Datenmenge (z.b. auf die Listenknoten einer Liste) zu haben, würden wir nicht nur das Konzept der Kapselung verletzen, sondern die Gefahr, dass die Benutzer Fehler programmieren, wäre zu groß. 22. ALP2-Vorlesung, M. Esponda 4

head Doppelt verkettete Listen current tail Dummy O1 O2 Dummy class ListNode <T> { T element; ListNode <T> next; ListNode <T> prev;... Um an einer beliebigen Stelle der Liste Elemente einfügen und löschen zu können, brauchen wir ein Referenz-Objekt (current), das sich durch die Liste bewegt. 22. ALP2-Vorlesung, M. Esponda 5 4

class ListNode <T> { T element;... ListNode <T> next; ListNode <T> prev; public class DoubleChainList<T> { private ListNode<T> head; private ListNode<T> tail; private ListNode<T> current; Doppelt verkettete Listen Dynamische Datenstrukturen sind sehr empfindlich. Ein Programmierer kann z.b. sehr leicht die Knoten-Referenzen zweier verschiedener Listen verwechseln und die Listen unwiederbringlich beschädigen, weil durch die rekursive Definition der Knoten einer Liste, der public DoubleChainList () { head = tail = null; /* weitere Methoden */... Zeiger auf den Listenanfang, der Zeiger der die Liste durchläuft und der Zeiger, der zwei Knoten der Liste verkettet, den gleichen Datentyp haben. 22. ALP2-Vorlesung, M. Esponda 6

Doppelt verkettete Listen head current tail Dummy Dummy O1 O2 O2 null O2 O2 22. ALP2-Vorlesung, M. Esponda 7

Iteratoren Lösung: Die objektorientierte Lösung zu diesem Problem ist die Verwendung von Iteratoren. Iteratoren sind Objekte, die eine Datenstruktur erhalten und Operationen zur Verfügung stellen, mit Hilfe derer man diese Datenstruktur durchlaufen kann. 22. ALP2-Vorlesung, M. Esponda 8

Iteratoren Iteratoren sind ein Softwarepattern zur Datenkapselung. Sie abstrahieren von der darunter liegenden Repräsentation der Daten. Beispiel: public interface Iterator <E> { boolean hasnext(); E next(); void remove(); 22. ALP2-Vorlesung, M. Esponda 9

Das Iteratormuster Iterator Pattern Um eine einheitliche Schnittstelle zur Traversierung unterschiedlicher zusammengesetzter Strukturen (das heißt, um polymorphe Iteration) zu ermöglichen, bieten die Standardbibliotheken vieler Sprachen das Iteratormuster. Mehrere Iteratoren können mit der gleichen Datenstruktur gestartet werden, und der Benutzer hat somit keinen direkten Zugriff auf die interne Struktur der dynamischen Datenmenge wie z.b. auf den internen current-zeiger einer Liste. 22. ALP2-Vorlesung, M. Esponda 10

Grundprinzip Das Iteratormuster 22. ALP2-Vorlesung, M. Esponda 11

Die Java-Implementierung des Iteratormusters Die Java-Bibliothek bietet eine Interface für die Implementierung von Iteratoren. Man muss allerdings folgende Probleme beachten: 1. Der Iterator muss immer seinen Zustand innerhalb der Iteration speichern. 2. Die Iteratoren sollen invalidiert werden, wenn sich die Sammlung oder die Datenstruktur durch Einfüge- oder Löschoperationen verändert hat. (CurrentModificationException). 22. ALP2-Vorlesung, M. Esponda 12

Das Iteratormuster von Java Einfaches Beispiel: public class LinkedList<T> implements Iterable<T> { ListNode<T> head; ListNode<T> tail; public ListIterator<T> iterator() { return new ListIterator<T>(head); public void insert( T elem ){ ListNode<T> temp; if (head==null) { temp = new ListNode<T>(elem,null,null); else{ temp = new ListNode<T>(elem,head,null); head.prev = temp; head = temp; 22. ALP2-Vorlesung, M. Esponda 13 13

Das Iteratormuster von Java Innere-Klasse private class ListNode<E> { E elem; ListNode<E> next; ListNode<E> prev; public ListNode(E elem, ListNode<E> next, ListNode<E> prev) { this.elem = elem; this.next = next; this.prev = prev; 22. ALP2-Vorlesung, M. Esponda 14

Das Iteratormuster von Java Einfaches Beispiel: Innere-Klasse class ListIterator<T> implements Iterator<T> { ListNode<T> current; ListIterator(ListNode<T> head) { current = head; public boolean hasnext() { return (current.next!= null); public T next() { if (current == null){ return null; T ret = current.elem; current = current.next; return ret; public void remove(){ // not implemented 22. ALP2-Vorlesung, M. Esponda 15

Das Iteratormuster von Java public class TestListIterator { Einfaches Beispiel: public static void main( String[] args ){ LinkedList<Integer> ll = new LinkedList<Integer>(); ll.insert(1); ll.insert(2); ll.insert(3); ll.insert(4); ll.insert(1); ll.insert(5); ListIterator li = ll.iterator(); for ( ; li.hasnext() ; ) { System.out.println( li.next() ); 22. ALP2-Vorlesung, M. Esponda 16

Das Iteratormuster von Java Beispiel: public class PrimesIterator implements Iterator<Integer>{ int current = 1; public boolean hasnext() { return true; public Integer next() { while ( true ) { current++; for ( int i = 2; current % i!= 0; i++) { if (i*i >= current) return current; public void remove(){ 22. ALP2-Vorlesung, M. Esponda 17

Das Iteratormuster von Java Beispiel: public class TestPrimesIterator {... public static void main(string[] args) { PrimesIterator pi = new PrimesIterator(); int n = 2; while(n<100){ n = pi.next(); System.out.println(n); // end of class TestPrimesIterator 22. ALP2-Vorlesung, M. Esponda 18

Iteratoren public interface Iterator <E> public interface ListIterator <E> public interface Iterator <E> { void add( E o ) boolean hasnext(); boolean hasprevious() E next(); E void previous(); remove(); void set( E o ) ; int int nextindex(); previousindex() 22. ALP2-Vorlesung, M. Esponda 19 19