Software-Entwurfsmuster

Compound-Iterator

Problem

Gegeben ist eine ArrayList a0, deren Einträge wiederum ArrayLists sind, die Objekte vom Typ String enthalten. Es sollen nun alle diese String-Objekte durchlaufen werden.

 

Benötigt wird ein Compound-Iterator mit einem Basisiterator, der die ArrayList a0 durchläuft und mit einem Subiterator, der die einzelnen ArrayLists durchläft, die als Einträge der Haupt-ArrayList a0 auf­treten. Ferner wird eine Funktion composeItems benötigt, um aus den Cursor-Objekten der beiden Iteratoren ein Objekt zu machen, das mit next() zurückgegeben wird. In diesem Beispiel wird nur das Cursor-Objekt des Subiterators zurückgegeben.

Diese Funktionalität wird in einem Behavior NestedArrayLists spezifiziert, das dem Compound-Iterator übergeben wird.

Behavior NestedArrayLists

Das Behavior NestedArrayLists erzeugt einen Compound-Iterator, der eine ArrayList von ArrayLists mit Einträgen vom Typ Type durchläuft. Im Konstruktor wird der Klasse die zu durchlaufende Haupt-ArrayList übergeben. Es folgen dann die drei Methoden, die in der abstrakten Basisklasse CompoundIteratorBehavior festgelegt sind.

In der Methode baseIterator wird der Basisiterator angegeben, der die Haupt-ArrayList durchläuft, und in der Methode subIterator der jeweilige Subiterator, hier in Abhängigkeit von dem aktuellen Eintrag der Haupt-ArrayList. Die Methode composeItems verwendet hier nur den Eintrag der Unter-ArrayList.

Die erwähnte Factory-Methode, die den fertigen Iterator zurückgibt, befindet sich in der Basisklasse CompoundIteratorBehavior.

 

public class NestedArrayLists<Type>
extends CompoundIteratorBehavior<ArrayList<Type>, TypeType>
{
    private ArrayList<ArrayList<Type>> a0;

    public NestedArrayLists(ArrayList<ArrayList<Type>> a0_)
    {
        a0=a0_;
    }

    @Override
    // the base iterator
    public Iterator<ArrayList<Type>> baseIterator()
    {
        return a0.iterator();
    }

    @Override
    // the subiterator, x0 is the cursor object of the base iterator
    public Iterator<Type> subIterator(ArrayList<Type> x0)
    {
        return x0.iterator();
    }

    @Override
    // specifies the object composed of the two cursor objects x0 and x1
    // (here only x1 is used)
    public Type composeItems(ArrayList<Type> x0, Type x1)
    {
        return x1;
    }

}

Anwendung

Die folgende Main-Funktion in der Klasse TestNestedArrayLists testet den Compound-Iterator für NestedArrayLists.

 

public class TestNestedArrayLists
{
    public static void main(String[] args)
    {
        ArrayList<ArrayList<String>> a0;
        ArrayList<String> a1;

        a0=new ArrayList<ArrayList<String>>();

        a1=new ArrayList<String>();   
        a1.add("00");
        a1.add("01");
        a1.add("02");
        a0.add(a1);

        a1=new ArrayList<String>();   
        a1.add("10");
        a0.add(a1);
   
        a1=new ArrayList:(String>();   
        a1.add("20");
        a1.add("21");
        a0.add(a1);

        // with compound iterator
        Iterator<String> ci=new NestedArrayLists<String>(a0).iterator();
        while (ci.hasNext())
            System.out.print(ci.next()+" ");
        System.out.println();

        // or simpler with for-each loop
        for (String s : new NestedArrayLists<String>(a0))
            System.out.print(s+" ");
        System.out.println();   
    }

}

Zusammenfassung

Die konkret benötigte Funktionalität eines Compound-Iterators wird in einem Behavior (hier NestedArrayLists) festgelegt. Dies geschieht dort durch Angabe eines Basisiterators, eines Subiterators und der Funktion composeItems.

Zugrunde gelegt werden dabei getestete Implementierungen der Klassen Compound-Iterator und Compound-IteratorBehavior.

Für das angegebene sehr einfache Beispiel lohnt sich der Aufwand, einen Compound-Iterator zu benutzen, vielleicht nicht. Dadurch aber, dass der Compound-Iterator selbst das Iterator-Interface implementiert, kann er überall eingesetzt werden, wo ein Iterator stehen kann, also z.B. als Basisiterator in einem Filteriterator oder als Subiterator in einem anderen Compound-Iterator.

 

Weiter mit:   [Implementierung CompoundIterator] [up]

 


H.W. Lang   mail@hwlang.de   Impressum   Datenschutz
Created: 05.02.2008   Updated: 18.02.2023
Diese Webseiten sind während meiner Lehrtätigkeit an der Hochschule Flensburg entstanden