Listen Prof. Dr. Christian Böhm in Zusammenarbeit mit Gefei Zhang

Slides:



Advertisements
Ähnliche Präsentationen
Objektorientierte Programmierung
Advertisements

der Universität Oldenburg
Klassen - Verkettete Liste -
DVG Dateien Dateien. DVG Dateien 2 Die Klasse File Die Klasse File stellt die Verbindung zwischen dem Filesystem des Rechners und dem.
Zusammenfassung der Vorwoche
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Kapselung , toString , equals , Java API
Lineare Suche Divide-and-Conquer-Suche Kombinationssuche
Kapitel 3: Listen Lineare Liste: endliche Folge von Elementen eines Grundtyps (n>=0), leere Liste falls n=0 Listenelemente besitzen.
Ausnahmen HS Merseburg (FH) WS 06/07.
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Listen Richard Göbel.
Indirekte Adressierung
Java: Grundlagen der Objektorientierung
WS Algorithmentheorie 05 - Treaps Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (13 – Offenes Hashing) Prof. Th. Ottmann.
Algorithmen und Datenstrukturen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (07 - Skiplisten) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Benötigte Applets Startseite: in HTML-Format Applet auf der Startseite Das Applet, das auf der Startseite geladen wird, wird die vier Buttons und die eine.

Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Diskrete Mathematik I Vorlesung 6 Binärer Suchbaum II.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
PRJ 2007/1 Stefan Dissmann Motivation Problem: Benutztes Objekt kennt den Kontext seiner Nutzung nicht. Daher kann es in besonderen Situationen keine Entscheidung.
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
Entwurfsmuster – Iterator
07-GraphischeObjekte Graphische Objekte in EMMA301Paint.
DVG Klassen und Objekte
Einführung in die Programmierung Datensammlung
© 2002 Dr. Cavelius - Ley - Pohlig - Taulien Programmierung im Netz und Internet: Einführung in die Programmiersprache Java Teil I 1 Klassen Objekte von.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Einfach verkettete Listen
Einfach verkettete Listen (OOP)
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Einfach und doppelt verkettete Listen in JAVA by Jens Weibler
Parameterübergabemechanismen für den Methodenaufruf
Grundlegende Sortieralgorithmen
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Thomas Hilpold: Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold.
Robuste Programme durch Ausnahmebehandlung
Vererbung Prof. Dr. Christian Böhm in Zusammenarbeit mit Gefei Zhang
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Java-Kurs Übung Besprechung der Hausaufgabe Listen und Mengen Komplexitäten Iteratoren (Durchlaufen von Listen/Mengen)
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Gerhard Gröger Einführung in die Programmierung mit Java 10. Vorlesung WS 2002/2003.
Diskrete Mathe Diskrete Mathematik I Listen Vorlesung 4.
Tutorium Software-Engineering SS14 Florian Manghofer.
 Präsentation transkript:

Listen Prof. Dr. Christian Böhm in Zusammenarbeit mit Gefei Zhang http://www.dbs.ini.lmu.de/Lehre/NFInfoSW

Ziele Standardimplementierungen für Listen kennenlernen Listeniteratoren verstehen Unterschiede zwischen Listen und Arrays kennenlernen

Die Rechenstruktur der Listen Eine Liste ist eine endliche Sequenz von Elementen, deren Länge (im Gegensatz zu Reihungen) durch Hinzufügen und Wegnehmen von Elementen geändert werden kann. Standardoperationen für Listen sind: Löschen aller Elemente der Liste Zugriff auf und Änderung des ersten Elements Einfügen und Löschen des ersten Elements Prüfen auf leere Liste, Suche nach einem Element Berechnen der Länge der Liste, Revertieren der Liste Listendurchlauf Die Javabibliothek bietet Standardschnittstellen und -Klassen für Listen an: interface List, class LinkedList, ArrayList die weitere Operationen enthalten, insbesondere den direkten Zugriff auf Elemente durch Indizes wie bei Reihungen  ! Problematisch: Führt zur Vermischung von Reihung und Liste

Listenimplementierung: Einfach verkettete Listen Eine einfach verkettete Liste ist eine Sequenz von Objekten, wobei jedes Element auf seinen Nachfolger in der Liste zeigt. Unterschiedliche Implementierungen: 1. Realisierung des Anfügens vorne in konstanter Zeit: :List anchor= :ListElem value =... tail = :ListElem value =... tail = :ListElem value =... tail = null Listenkopf; anchor wirkt als „Anker“, der auf das erste Listenelement zeigt Ein Listenelement besitzt einen Inhalt (value) und einen Verweis auf das folgende Element (tail)

Einfach verkettete Listen 2. Realisierung des Anfügens vorne und hinten in konstanter Zeit: :List anchor= :ListElem value =... tail = :ListElem value =... tail = :ListElem value =... tail = null last = :List anchor= :ListElem value =... tail = 3. Zirkuläre Liste:

Einfach verkettete Listen: UML-Entwurf + ListElem anchor 0..1 tail 0..1 + void clear() ... + void addFirst(Object o) + Object removeFirst() - Object value + Object getValue() + ListElem getTail() + void setValue(Object o) + void setTail(ListElem elem)

Einfach verkettete Listen in Java public class List { private ListElem anchor; //Konstruktoren public List() { anchor = null; } public List(Object o) { anchor = new ListElem(o); ... Erzeugung einer leeren Liste Erzeugung einer einelementigen Liste Das Objekt o muss in einem ListElem "verpakt" werden

Einfach verkettete Listen in Java public class ListElem { private Object value; private ListElem tail; public ListElem(Object o) {value = o; tail = null;} public ListElem(Object o, ListElem t) {value = o; tail = t;} public ListElem getTail() { return tail; } public void setTail(ListElem elem) { tail = elem;} public Object getValue() {return value;} public void setValue(Object v) {value = v;} . . . } Konstruktoren Getter- und Setter-Methoden

Einfügen eines Objekts o am Anfang der Liste :ListElem value =... tail = tail = null :List anchor= Vorheriger Wert von anchor wid tail des neuen Elements :ListElem value = o tail = public class List { public void addFirst(Object o) { anchor = new ListElem(o, anchor); } . . .

Entfernen (und Zurückgeben) des ersten Elements :List anchor= :ListElem value =... tail = :ListElem value =... tail = :ListElem value =... tail = null public Object removeFirst() throws NoSuchElementException { if (anchor == null) { throw new NoSuchElementException(); } else { Object result = anchor.getValue(); anchor = anchor.getTail(); return result; Ausnahme, wenn Liste leer rettet den Wert des ersten Elements Gibt den Wert des „alten“ ersten Elements zurück

Listendurchlauf mit Listeniterator anchor= :ListElem value =... tail = :ListElem value =... tail = :ListElem value =... tail = null null null :ListIterator current = next =

Listendurchlauf mit Listeniterator anchor= :ListElem value =... tail = :ListElem value =... tail = :ListElem value =... tail = null :ListIterator current = next = Ein Listeniterator ermöglicht den Zugriff auf die Elemente einer verketteten Liste Ein Listeniterator sollte die Liste während des Zugriffs vor (unkontrollierten) Änderungen schützen (hier nicht realisiert)

Listendurchlauf: Listeniterator in UML ListIterator iterator() Zeigt auf das aktuelleElement Konstruiert ListIterator anchor 0..1 ListIterator boolean hasNext() Object next() current 0..1 + ListElem next 0..1 Gibt das nächste Element zurück und setzt den Iterator auf das übernächste Element Zeigt auf das nächste Element Gibt true zurück, wenn weitere Elemente vorhanden sind

Listeniterator in Java class ListIterator { protected ListElem current; protected ListElem next; public boolean hasNext(){ return next != null; } ... hasNext() ergibt true, wenn es ein nächstes Element gibt

Weiterschalten des Listeniterators in Java public Object next() throws NoSuchElementException { if (nextElem == null) { throw new NoSuchElementException(); } current = next; next = next.getTail(); return currentElem.getValue(); Schaltet den Iterator weiter und gibt den value eines ListElem zurück! Ausnahme, wenn kein nächstes Element exisitiert :List anchor= :ListElem value =... tail = tail = null :ListIterator current = next =

Konstruktor für ListIterator ListIterator(ListElem elem) { next = elem; } Das nächste Element ist elem (und das „current“ Element ist null) elem ListElement ohne Vorgänger! :ListElem value =... tail = :ListElem value =... tail = :ListElem value =... tail = new Listiterator(elem) erzeugt einen ListIterator, der vor elem steht :ListIterator current = null next =

Erzeugung eines Listeniterators in der Klasse List public class List { private ListElem anchor; ... public ListIterator iterator() { return new ListIterator(anchor); } :List anchor= :ListElem value =... tail = tail = null l.iterator() erzeugt einen ListIterator, der vor dem ersten Element der Liste l steht :ListIterator current = null next =

Listendurchlauf mit Iteratoren Schema: Iterator iter = l.iterator(); while (iter.hasNext()) { iter.next(); << mache etwas>> } erzeuge Iterator für Liste l Solange ein nächstes Element existiert Mache etwas und schalte zum nächsten Element weiter

Beispiele für Listeniteration: Länge der Liste public class List { . . . erzeuge Iterator public int size() { int result = 0; ListIterator iter = this.iterator(); while(iter.hasNext()) { result++; iter.next(); } return result; . . . Solange ein nächstes Element existiert Erhöhe um 1 und schalte zum nächsten Element weiter

Beispiele für Listeniteration: Suche in der Liste class List { . . . erzeuge Iterator public boolean contains(Object o) { ListIterator iter = l.iterator(); while (iter.hasNext()) { if (iter.next().equals(o)) return true; } return false; . . . Solange ein nächstes Element existiert Prüft aktuelles Element auf Gleichheit und schaltet zum nächsten Element weiter Wenn Element nicht gefunden

Beispiele für Listeniteration: Revertieren der Liste anchor= :ListElem value = 3 tail = :ListElem value = 5 tail = :ListElem value = 7 tail = null :ListElem value = 3 tail = null :ListElem value = 5 tail = :ListElem value = 7 tail = newAnchor= public void reverse() { ListElem newAnchor = null; ListIterator iter = iterator(); while(iter.hasNext()) { newAnchor = new ListElem(iter.next(), newAnchor); } anchor = newAnchor; erzeugt neues Listenelement mit umgedrehtem Verweis

Beispiele für Listeniteration: Listenvergleich Die Listenvergleichsoperation public boolean equals(Object o) prüft, ob zwei Listenobjekte die gleiche Länge haben und ihre Elemente jeweils den gleichen Wert (value) besitzen. Die von der Klasse Object geerbte Methode equals wird überschrieben. Sind die Längen unterschiedlich oder sind die Listenelemente nicht alle „equals“ zueinander, so ist das Ergebnis false. Das Ergebnis ist auch false, wenn o nicht vom Typ List ist.

Beispiele für Listeniteration: Listenvergleich Beispiel: Folgendes sollte beim Testen gelten: l = new List("foo"); List l1 = new List("foo"); l1.addFirst("baz"); :List anchor= :ListElem value = „foo“ tail = l l1  :List anchor= :ListElem value = „foo“ tail = :ListElem value = „baz“ tail =

Beispiele für Listeniteration: Listenvergleich Erzeuge 2 Iteratoren public boolean equals(Object l) { try { ListIterator iter1 = this.iterator(); ListIterator iter2 = ((List)l).iterator(); while (iter1.hasNext() && iter2.hasNext()){ Object o1 = iter1.next(); Object o2 = iter2.next(); if (!o1.equals(o2)) return false; } return iter1.hasNext() == iter2.hasNext(); catch(Exception e) { return false; return false, falls this oder l kein Listenobjekt solange beide noch ein nächstes Element haben Vergleiche u. schalte beide Iteratoren weiter return true, falls nach dem Ende von while beide Listen keine weiteren Elemente (d.h. die gleiche Länge) haben

Verfeinerung: Doppelt verkettete Listen Doppelt verkettete Listen können auch von rechts nach links durchlaufen werden. value =... tail = prevs= :List anchor= :ListElem :ListElem value =... tail = prevs= null Ein Listenelement besitzt einen Inhalt (value) und je einen Verweis auf das folgende (tail) u. das vorhergehende Element (prevs) Die Standardlistenklasse von Java ist doppelt verkettet implementiert.

Verfeinerung: Zeiteffiziente einfach verkettete Listen Durch Hinzufügen eines Attributs für die Länge der Liste erhält die Abfrage nach der Größe der Liste konstante Zeitkomplexität: + List ListElem anchor int len void clear() ... int size() return len;

Zusammenfassung Listen werden in Java als einfach oder doppelt verkettete oder auch als zirkuläre und Ringlisten realisiert. Zur Implementierung definiert man eine Klasse List, mittels eines Ankers (anchor) auf Objekte der Klasse ListElem zeigt. Diese sind über die tail- und prevs-Zeiger miteinander verknüpft. Der Listendurchlauf wird mit Hilfe der Klasse ListIterator realisiert. Iteratorobjekte wandern sequentiell durch die Liste.