Grundkonzepte java.util.list Eine List ist eine Spezialisierung einer allgemeinen Ansammlung (Collection): Lineare Ordnung ist definiert Zugriff über Rang oder Position Volle Kontrolle wo eingefügt bzw. gelöscht wird. Eine Liste kann Elemente mehrfach enthalten (insbes. null-elemente). Zugriffsoperationen können je nach Implementierung teuer sein. Wenn immer möglich soll die Liste mittels einem Iterator abgearbeitet werden. Algorithmen und Datenstrukturen 4-13 Interface List (1) public interface List extends Collection { // Zugriff und Suche Object get(int index); int indexof(object o); int lastindexof(object o); // Veränderung Object set(int index, Object element); //Opt. void add(object element); //Opt. void add(int index, Object element); //Opt. Object remove(object element); //Opt. Object remove(int index); //Opt. Algorithmen und Datenstrukturen 4-14
Interface List (2) // Iterator ListIterator listiterator(); ListIterator listiterator(int index); // Bereich List sublist(int from, int to); Algorithmen und Datenstrukturen 4-15 Konzept ListIterator (1) Ein ListIterator unterstützt das Abarbeiten einer Folge in der gewünschten Reihenfolge (vorwärts bzw. rückwärts). Traversieren einer Liste in Vorwärtsrichtung ist mittels next() und hasnext()möglich. o ListIterator it=l.listiterator(); while(it.hasnext()) { Object o = it.next(); //Objekt o verarbeiten Algorithmen und Datenstrukturen 4-16
Konzept ListIterator (2) previous() und hasprevious() analog für rückwärts. set(object o) ersetzt Element, das als letztes besucht wurde. remove() entfernt Element, das als letztes besucht wurde. o Algorithmen und Datenstrukturen 4-17 Konzept ListIterator (3) a b add(object o) fügt Element an der gegenwärtigen Iteratorposition ein d.h. vor dem Element, das next() bzw. hinter dem Element, das prev() liefern würde. a b Algorithmen und Datenstrukturen 4-18
Interface ListIterator public interface ListIterator extends Iterator { boolean hasnext(); Object next(); boolean hasprevious(); Object previous(); int int nextindex(); previousindex(); void remove(); // Optional void set(object o); // Optional void add(object o); // Optional Algorithmen und Datenstrukturen 4-19 Klasse ArrayList public class ArrayList extends AbstractList implements List,... Implementierung mittels Felder, die in der Grösse anwachsen können. Grosse Ähnlichkeit mit Vector(). Hauptunterschied zu Vector(): Keine Synchronisation, ArrayList() effizienter bei sequentiellen Programmen Veränderung bei gleichzeitigem Lesen erkannt (fail-safe). Algorithmen und Datenstrukturen 4-20
Klasse LinkedList public class LinkedList extends AbstractSequentialList implements List,... Implementierung mittels doppelt verketteter Listen. Direktzugriffsoperationen zu vermeiden. Ebenfalls fail-safe. Algorithmen und Datenstrukturen 4-21 Collection und Verwandte Das Collection Rahmenwerk besteht aus einer Reihe von hierarchisch aufgebauten Schnittstellen. Algorithmen und Datenstrukturen 4-22
Interface Collection (1) public interface Collection { int size(); boolean isempty(); boolean contains(object element); boolean add(object element); //Optional boolean remove(object element); //Optional Iterator iterator(); boolean containsall(collection c); boolean addall(collection c); //Optional boolean removeall(collection c);//optional boolean retainall(collection c);//optional void clear(); //Optional Algorithmen und Datenstrukturen 4-23 Interface Collection (2) Object[] toarray(); Object[] toarray(object a[]); Per Konvention sollen alle konkreten Implementierungen einen Konstruktor mit dem Argument Collection haben, der aus einem beliebigen Collection-Typ ein neues Objekt erzeugt. Vorteil: Konversionen zwischen allen Typen möglich. List l = new ArrayList(c); Algorithmen und Datenstrukturen 4-24
Klasse AbstractCollection public abstract class AbstractCollection implements Collection Diese Klasse ist eine Skelettimplementierung des Collection-Interface. Für die Realisierung einer nichtveränderbaren Collection-Klasse muss nur size() und iterator() implementiert werden. Algorithmen und Datenstrukturen 4-25 Klasse AbstractList public abstract class AbstractList extends AbstractCollection implements List Geeignet für Listen mit Direktzugriff. listiterator bereits vorhanden. Für die Realisierung einer nichtveränderbaren Liste muss nur get(int index) und size() implementiert werden. Algorithmen und Datenstrukturen 4-26
Klasse AbstractSequentialList public abstract class AbstractSequentialList extends AbstractList Geeignet für Listen mit sequentiellem Zugriff. get(int index),... bereits vorhanden. Für die Realisierung einer nichtveränderbaren Liste müssen nur noch Methoden des listiterators implementiert werden. Algorithmen und Datenstrukturen 4-27 Interface Iterator public interface Iterator { boolean hasnext(); Object next(); void remove(); // Optional Typische Anwendung: Einzelne Elemente nacheinander besuchen Iterator it=c.iterator(); while(it.hasnext()) { Object o = it.next(); //Objekt o verarbeiten Algorithmen und Datenstrukturen 4-28
Klasse Collections Die Klasse Collections in java.util besteht aus einer Sammlung von statischen Methoden, mit denen Listen und andere Datenstrukturen des Collection Rahmenwerks bearbeitet werden können. Es gibt 2 unterschiedliche Anwendungsbereiche: Methoden zur algorithmischen Unterstützung: min, max, search shuffle, sort Definition von Sichten / Wrapper: synchronized... unmodifiable... Algorithmen und Datenstrukturen 4-29