Programmieren Tutorium 12

Collections

Gliederung

  • Iterator
  • The Collection Framework
  • Utility-Klassen

Iterator

Übersicht

  • Entwurfsmuster aus der Kategorie Entkopplungsmuster
  • Ermöglicht sequenziellen Zugriff auf Elemente einer Datenstruktur ohne die innere Struktur zu kennen
  • Interface
    • boolean hasNext()
    • E next()
    • void remove() (optional)

Beispiel

private final class ListIterator implements Iterator<T> {
    private Element current;
    private ListIterator() { current = head; }
    public boolean hasNext() { return current.next != null; }
    public T next() {
        if (hasNext()) {
            current = current.next;
            return current.value;
        } else throw new NoSuchElementException();
    }
    public void remove() { throw new UnsupportedOperationException(); }
}

The Collection Framework

Overview

Hierarchy

Iterable

public interface Iterable<T> {
    /**
     * Returns an iterator over a set of elements of type T.
     * @return an Iterator.
     */
    Iterator<T> iterator();
}

interface Collection<E>

  • Erbt von Iterable
  • Modelliert eine Sammlung von irgendwas
  • Bietet Methoden wie
    • boolean add(E)
    • boolean remove(Object)
    • boolean contains(E)
    • int size()
    • …
  • Keine direkten Implementierungen

interface List<E>

  • Erbt von Collection
  • Modelliert eine geordnete Sequenz von irgendwas
  • Fügt Methoden für indizierten Zugriff hinzu
    • boolean get(int)
    • boolean set(int, E)
    • boolean add(int, E)
    • boolean remove(int)
    • int indexOf(Object)
    • …
  • Implementierungen: ArrayList, LinkedList, …

interface Set<E>

  • Erbt von Collection
  • Modelliert eine Menge im mathematischen Sinn
    • Enthält folglich keine Duplikate
  • Keine neuen Methoden, jedoch gewisse Zusicherungen
  • Implementierungen
    • Set => HashSet, EnumSet
    • SortedSet => TreeSet

Queue und Deque

  • Queue
    • Warteschlange (z.B FIFO, Priority)
    • Implementierungen: LinkedList, PriorityQueue, …
  • Deque
    • Double-Ended-Queue, erbt von Queue
    • Implementierungen: LinkedList, ArrayDeque, …

interface Map<K,V>

  • Jeder key verweist auf ein value
  • Es werden immer Paare von key und value eingefügt
  • Enthält keine doppelten keys
  • Implementierungen
    • Map => HashMap, LinkedHashMap (Zugriff in O(1))
    • SortedMap => TreeMap (Zugriff in O(log n))

Utility-Klassen

class Collections

void reverse(List<?> list)
void shuffle(List<?> list)
T max(Collection<? extends T> coll)
boolean disjoint(Collection<?> c1, Collection<?> c2)
Collection<T> unmodifiableCollection(Collection<? extends T> c)

class Arrays

void sort(Object[] a)
void fill(Object[] a, Object val)
List<T> asList(T... a)
int binarySearch(T[] a, T key, Comparator<? super T> c)

Task

Write a method that takes a string and returns the number of unique characters in the string.

The method should cache the results, so that when the method is given a string previously encountered, it will simply retrieve the stored result.

Lösung

Feierabend!

© xkcd.com/292/