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. Departement Informatik Universität Basel Algorithmen und Datenstrukturen Folgen und Java Collections 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); void add(Object element); void add(int index, Object element); Object remove(Object element); Object remove(int index); Departement Informatik Universität Basel Algorithmen und Datenstrukturen Folgen und Java Collections //Opt. //Opt. //Opt. //Opt. //Opt. 4-14 Interface List (2) // Iterator ListIterator listIterator(); ListIterator listIterator(int index); // Bereich List subList(int from, int to); } Departement Informatik Universität Basel Algorithmen und Datenstrukturen Folgen und Java Collections 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 } Departement Informatik Universität Basel Algorithmen und Datenstrukturen Folgen und Java Collections 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 Departement Informatik Universität Basel Algorithmen und Datenstrukturen Folgen und Java Collections 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 Departement Informatik Universität Basel Algorithmen und Datenstrukturen Folgen und Java Collections b 4-18 Interface ListIterator public interface ListIterator extends Iterator { boolean hasNext(); Object next(); boolean hasPrevious(); Object previous(); int int nextIndex(); previousIndex(); void void void remove(); set(Object o); add(Object o); // Optional // Optional // Optional } Departement Informatik Universität Basel Algorithmen und Datenstrukturen Folgen und Java Collections 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). Departement Informatik Universität Basel Algorithmen und Datenstrukturen Folgen und Java Collections 4-20 Klasse LinkedList public class LinkedList extends AbstractSequentialList implements List, ... • Implementierung mittels doppelt verketteter Listen. • Direktzugriffsoperationen zu vermeiden. • Ebenfalls „fail-safe“. Departement Informatik Universität Basel Algorithmen und Datenstrukturen Folgen und Java Collections 4-21 Collection und Verwandte Das Collection Rahmenwerk besteht aus einer Reihe von hierarchisch aufgebauten Schnittstellen. Departement Informatik Universität Basel Algorithmen und Datenstrukturen Folgen und Java Collections 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 boolean boolean boolean void Departement Informatik Universität Basel containsAll(Collection c); addAll(Collection c); //Optional removeAll(Collection c);//Optional retainAll(Collection c);//Optional clear(); //Optional Algorithmen und Datenstrukturen Folgen und Java Collections 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); Departement Informatik Universität Basel Algorithmen und Datenstrukturen Folgen und Java Collections 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. Departement Informatik Universität Basel Algorithmen und Datenstrukturen Folgen und Java Collections 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. Departement Informatik Universität Basel Algorithmen und Datenstrukturen Folgen und Java Collections 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. Departement Informatik Universität Basel Algorithmen und Datenstrukturen Folgen und Java Collections 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 } Departement Informatik Universität Basel Algorithmen und Datenstrukturen Folgen und Java Collections 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... Departement Informatik Universität Basel Algorithmen und Datenstrukturen Folgen und Java Collections 4-29