Programmieren I. Kapitel 13. Listen

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

Java Einführung Collections

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

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

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

Studentische Lösung zum Übungsblatt Nr. 7

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

5. Tutorium zu Programmieren

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

Objektorientierte Programmierung

Objektorientierte Programmierung

Inhalte Informatik. I1 Grundprinzip des objektorientierten Modellierens I3 Modellieren von Netzwerkanwendungen

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Grundlagen der Informatik Generische Klassen

Informatik 11 Kapitel 2 - Rekursive Datenstrukturen

Selbststudium OOP Programmieren 1 - H1103 Felix Rohrer

1. Übung zu "Numerik partieller Differentialgleichungen"

Aufgabenblatt Nr. 5 Generizität und TicTacToe

Modellierung und Programmierung 1

Folge 18 - Vererbung

Generische Datenstrukturen

Java-Schulung Grundlagen

1 Polymorphie (Vielgestaltigkeit)

1. Grundlegende Konzepte in Java (6 Punkte)

Generische Typen in Java 1.5. Die Erweiterung der Java Language Specification

Client-Server-Beziehungen

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Dr. Monika Meiler. Inhalt

Objektorientierte Programmierung

368 4 Algorithmen und Datenstrukturen

Abstrakte Datentypen.

von Anja Austermann Drag and Drop

Algorithmen und Datenstrukturen

Programmieren in Java

Über Arrays und verkettete Listen Listen in Delphi

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Kapitel 6. Vererbung

HEUTE. Effizienzbeispiel: bekannte Version (Übung ) Mathematik: Was ist Effizienz? vollständige Induktion

In vergleichsbasierten Suchbäumen wird nicht in Schlüssel hineingeschaut.

Institut für Informatik

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

Datenbankanwendungsprogrammierung Crashkurs Java

Java Generics & Collections

Vorlesung Informatik 2 Algorithmen und Datenstrukturen. (20 Graphen) T. Lauer

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Propädeutikum zur Programmierung

Objektorientierte Programmierung mit C++ Vector und List

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2007/2008

Software Engineering Klassendiagramme Assoziationen

Type Erasure in Java 5. Helmi Jouini Institut für Theoretische Informatik Universität Karlsruhe

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Kapitel 6. Vererbung

Struktur am Beispiel einer Liste

Informationsverarbeitung im Bauwesen

Schnittstellen implementieren am Beispiel Suchbaum

27. August 2013 Einleitung. Algorithmen und Datenstrukturen

12) Generische Datenstrukturen

Name: Klausur Programmierkonzepte SS 2011

Datenstrukturen in Java

Einführung in die Programmierung Konstanten, dynamische Datenstrukturen. Arvid Terzibaschian

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

Große Übung Praktische Informatik 1

Probeklausur: Programmierung WS04/05

8 Zugriffstypen ( Zeiger )

Dr. Monika Meiler. Inhalt

Android will doch nur spielen. Java Eine kurze Einführung

HEUTE. Datenstrukturen im Computer. Datenstrukturen. Rekursion. Feedback Evaluation. abstrakte Datenstrukturen

Design Patterns 2. Model-View-Controller in der Praxis

Beispiel für eine rekursive Funktion

Übungspaket 31 Entwicklung eines einfachen Kellerspeiches (Stacks)

Inhaltsverzeichnis. 2.2 Grundlagen der UML Zusammenfassung... 53

Programmierkurs Java

Abteilung Informatik, JFC/Swing 2004 Diego Schmidlin V2.2

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

Repetitorium Informatik (Java)

Die Java Stream API. Funktionale Programmierung mit der Stream API des JDK 1.8. Prof. Dr. Nikolaus Wulff

Vorlesung 09: Mengen. Peter Thiemann SS 2010

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Reihungen. Martin Wirsing. in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03

Algorithmen und Datenstrukturen. Dr. Beatrice Amrhein

Binärbäume. Prof. Dr. E. Ehses,

Übersicht. Schleifen. Schleifeninvarianten. Referenztypen, Wrapperklassen und API. 9. November 2009 CoMa I WS 08/09 1/15

Programmierung in C. Grundlagen. Stefan Kallerhoff

Rekursion. Was heißt "rekursiv" Page 1. Eine Methode m() heißt rekursiv, wenn sie sich selbst aufruft. Beispiel: Berechnung der Fakultät (n!

Tutorium 5 - Programmieren

Effiziente Java Programmierung

Java Einführung Abstrakte Klassen und Interfaces

Arrays Fortgeschrittene Verwendung

5.4 Klassen und Objekte

FHZ. K20 Arrays. Lernziele. Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren. Inhalt

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

Neue Features in C# 2.0

Modul 122 VBA Scribt.docx

Kapitel 6. Vererbung

Algorithmen & Datenstrukturen 1. Klausur

Persistenz von Objekten relationale Datenbank Eigene Datenstruktur XML (JAXB) Proprietäre Dateiformate (Lochkarten)

Arrays von Objekten. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Software Engineering. 6. Klassendiagramme. Franz-Josef Elmer, Universität Basel, HS 2012

Informatik. Studiengang Chemische Technologie. Michael Roth WS 2012/2013. Hochschule Darmstadt -Fachbereich Informatik-

Transkript:

Programmieren I Kapitel 13. Listen

Kapitel 13: Listen Ziel: eigene Datenstrukturen erstellen können und eine wichtige vordefinierte Datenstruktur( familie) kennenlernen zusammengehörige Elemente zusammenfassen Ergebnis in abstrakte Datentypen kapseln vordefinierte Varianten Iteratoren

Idee von Listen / Sequenzen Ziel: zusammengehörige Elemente hintereinander schreiben Frage: Unterschied zum Array?? kein direkter Zugriff auf Elemente in der Mitte nötig/möglich + Anzahl der Elemente unbekannt und dynamisch variabel Lösungsidee: jedes Element zusätzlich mit einer Referenz versehen, die auf das nächste Element verweist.

Idee von Listen / Sequenzen Definition: eine Liste besteht aus Zellen, von denen jede aus zwei Teilen besteht: das eigentliche Element selbst und eine Verkettung zum nächsten Listenelement. Das letzte Listenelement hat als Referenz null. Eine Liste besteht aus einer linearen Folge von Zellen.

Definition von Listen im alten Java class Cell { Object content; Cell next; Cell (Object content, Cell next) { this.content = content; this.next = next; Beachte: keinesfalls next als Feld von content machen (miserabler Stil!), sondern die Listendinge von den Inhaltsdingen trennen ( separation of concerns )

Aufbau von Listen im alten Java A B C Variante 1: Cell c3 = new Cell(C, null); Cell c2 = new Cell(B, c3); Cell c1 = new Cell(A, c2); Alternative (ohne rückwärts denken zu müssen): Cell c = new Cell(A, new Cell(B, new Cell(C,null)));

Standardoperationen auf Listen: vorne einfügen vorher h nachher h B C A B C vorne einfügen: h = new Cell(A, h);

Standardoperationen auf Listen: Einfügen hinter einem Element z vorher z B X A C nachher z X A B C Einfügen hinter dem Element z: z.next = new Cell(B, z.next); unnötiger Sonderfall: einfügen hinter dem letzten Element z: z.next = new Cell(B, null);

Standardoperationen auf Listen: Löschen des Nachfolgers von einem Element z vorher z X A B C nachher z X A C Löschen des Nachfolgers von dem Element z: z.next = z.next.next; B ist dadurch u.u. Speichermüll geworden

Standardoperationen auf Listen: Traversierung (Durchlauf) Zweck: suchen, allg: konsoldieren (fold, reduce): Länge, Summe, Mittelwert,... kopieren (teilweise) und filtern Funktionsanwendung auf alle Elemente (map)

Standardoperationen auf Listen: Traversierung (Durchlauf) Programmbeispiel suchen : Cell search(cell start, Object x) { Cell actual = start; while (actual!= null) { if (actual.content.equals(x)) { break; actual = actual.next; return actual;

Standardoperationen auf Listen: Traversierung (Durchlauf) Programmbeispiel Mittelwert : double average(cell start) { double sum = 0.0; int length = 0; Cell actual = start; while (actual!= null) { Measurement m = (Measurement)(actual.content); sum += m.value; length ++; actual = actual.next; if (length == 0) { return 0.0; else { return sum/length;

Definition von generischen Listen (sauberere Lösung) Definition der Klasse Cell mit generischen Typen: class Cell<Data> { Data content; Cell<Data> next; Cell (Data content, Cell<Data> next) { this.content = content; this.next = next;

Traversierung generischer Listen Programmbeispiel Mittelwert : double average(cell<measurement> start) { double sum = 0.0; int length = 0; Cell<Measurement> actual = start; while (actual!= null) { Measurement m = (Measurement)(actual.content); sum += m.value; length ++; actual = actual.next; if (length == 0) { return 0.0; else { return sum/length;

Aufbau zirkulärer Listen: Varianten von Listen: zirkuläre Listen A B C Cell<Point> last = new Cell<Point>(C,null); Cell<Point> triangle = new Cell<Point>(A, new Cell<Point>(B, last)); last.next = triangle; Typisch: Zyklus erst am Ende schließen

Traversierung zirkulärer Listen: Varianten von Listen: zirkuläre Listen Cell<Point> search(cell<point> start, Point p) { Cell<Point> result = null; Cell<Point> actual = start; do { if (actual.content.equals(p)) { result = actual; break; actual = actual.next; while (actual!= start); return result;

Varianten von Listen: doppelt verkettete Listen Struktur doppelt verketteter Listen: A B C class Dcell<Data> { Data content; Dcell<Data> prev, next; Dcell(Data x, Dcell<Data>p, Dcell<Data>n) { this.content = x; this.prev = p; this.next = n;

Listen??? A B C D E F G Wer Zugriff auf die next Referenzen hat, kann die Liste zerstören! Folge: Kapselung der Listenstruktur => abstrakte Datentypen

Abstrakte Datentypen Verhindere Zugriff von außen auf die Datenstruktur! Das erlaubt Kontrolle und damit Sicherheit, Korrektheit, Modularität. Dazu: kein Haufen von Zellen, sondern eine Struktur, die von außen nur durch Methoden und damit kontrolliert zugreifbar ist. Damit ist Implementierung losgelöst von der abstrakten Sicht. Beispiel: vordefinierte java.util.linkedlist und der Anfang der Implementierung einer solchen Klasse in MyLinkedList.java

Listenähnliche Datenstrukturen allgemeine Collection.html und die Listerweiterungen (lineare, also indizierbare Struktur) Bemerkung: Kombination von Interfaces und abstrakten Klassen

Listenähnliche Datenstrukturen Vergleich Set: wie Collection, aber semantisch ohne Mehrfacheinträge List: linear indiziert, Mehrfacheinträge möglich ArrayList: schnellerer Zugriff, langsamerer Update LinkedList: langsamerer Zugriff, schnellerer Update Vector: ArrayList, also dynamisches Array (synchronisiert, legacy) Stack: Hinzufügen und Entfernen nur an einem Ende Queue: Hinzufügen an einem, Entfernen am anderen Ende

Listenähnliche Datenstrukturen Typische Methodennamen für Stack und Queue push: Element hinzufügen pop: Element entfernen peek oder top: nächstes verfügbares (also zu löschendes) Element lesen, aber nicht entfernen empty: Test auf Leerheit

Iterator Zweck: durchlaufen der Datenstruktur analog zu Arrays Interface: boolean hasnext() Object next() void remove() remove als einzige sichere Löschmethode während der Iteration Implementierungsbeispiel: siehe SuperLinkedList.java

Iterator Anwendung Beispiel (altes Java): LinkedList polygon; for (Iterator i=polygon.iterator(); i.hasnext(); ) { Point p = (Point)(i.next());... p... Beispiel mit der neuen for Schleife aus Java 1.5 für Klassen, die das Interface Iterable<Data> implementieren (z.b. Collections und Arrays): LinkedList<Point> polygon; for (Point p:polygon) {... p...

Zusammenfassung Idee von Listen Realisierung der ersten eigenen Datenstruktur mit Hilfe von Referenzen Notwendigkeit zum Schutz => abstrakter Datentyp Listenähnliche Datenstrukturen Iteratoren