Filteriterator-Implementierung
Der Filteriterator ist nach dem Bridge-Entwurfsmuster gebildet. Er benötigt ein Behavior, das den Basisiterator und die Filterfunktion angibt. Ein solches konkretes Behavior wird von der abstrakten Klasse FilterIteratorBehavior abgeleitet; diese enthält auch gleich die Factory-Methode iterator, um den so gebildeten Filteriterator zu erzeugen.
Die hier angegebene Version verwendet Typ-Parameter.
Ein Behavior, das einen Filteriterator erzeugt, wird von der abstrakten Klasse FilterIteratorBehavior abgeleitet. So ist sichergestellt, dass ein Basisiterator und eine Filterfunktion vorhanden sind; außerdem steht die Factory-Methode iterator zur Verfügung.
public abstract class FilterIteratorBehavior<Type> implements Iterable<Type>
{
public abstract Iterator<Type> baseIterator();
public abstract boolean pass(Type x);
public Iterator<Type> iterator()
{
return new FilterIterator<Type>(this);
}
}
Eine gewisse Schwierigkeit bei der Implementierung eines Filteriterators entsteht dadurch, dass immer erst gesucht werden muss, ob noch ein Element vorhanden ist, das der Filterbedingung genügt. Dies wird mit der Methode tryGetNext durchgeführt.
public class FilterIterator<Type> implements Iterator<Type>
{
private FilterIteratorBehavior<Type> behavior;
private boolean hasnext;
private Iterator<Type> it;
private Type x;
public FilterIterator(FilterIteratorBehavior<Type> behavior)
{
this.behavior=behavior;
hasnext=true;
it=behavior.baseIterator();
x=tryGetNext();
}
@Override
public boolean hasNext()
{
return hasnext;
}
@Override
public Type next()
{
Type y=x;
x=tryGetNext();
return y;
}
private Type tryGetNext()
{
Type y;
while (it.hasNext())
{
y=it.next();
if (behavior.pass(y))
return y;
}
hasnext=false;
return null;
}
}
Weiter mit: [Anwendung eines Filteriterators] oder
[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