This repository has been archived on 2023-04-04. You can view files and clone it, but cannot push or open issues or pull requests.
progra19/tut9/src/FunctionalSetIterator.java
2019-12-14 15:38:45 +01:00

67 lines
1.4 KiB
Java

import java.util.*;
public class FunctionalSetIterator<E> implements Iterator<E>
{
/** Unsere Menge */
private FunctionalSet<E> set;
/** Aktuelles Element */
private SimpleFunctionalSet<E> current;
/** Bereits gesehene Elemente */
private Set<Object> seen = new FunctionalSet<>();
/** Aktuelles Element */
private E currentElem;
/** Ob das aktuelle Element bereits entfernt wurde. */
private boolean hasBeenRemoved = true;
private void skipToNext()
{
while (true)
{
current = current.getRemainingSet();
if (current instanceof RemoveSet)
seen.add(((RemoveSet) current).getObject());
else if (!(current instanceof AddSet) || !seen.contains(((AddSet)current).getElement()))
break;
}
}
public FunctionalSetIterator(FunctionalSet<E> set, SimpleFunctionalSet<E> head)
{
this.set = set;
current = head;
if (current instanceof RemoveSet)
{
seen.add(((RemoveSet)current).getObject());
skipToNext();
}
}
@Override
public boolean hasNext()
{
return !(current instanceof EmptySet);
}
@Override
public E next()
{
if (!hasNext())
throw new NoSuchElementException();
currentElem = ((AddSet<E>) current).getElement();
seen.add(currentElem);
skipToNext();
hasBeenRemoved = false;
return currentElem;
}
@Override
public void remove()
{
if (hasBeenRemoved)
throw new IllegalStateException("Das Element wurde schon entfernt");
set.remove(currentElem);
hasBeenRemoved = true;
}
}