/** * Recursively traverses all children (not only leaf nodes) of this SpanList, in a depth-first fashion. * The ListIterator only supports iteration forwards, and the optional operations that are implemented are * remove() and set(). add() is not supported. * * @return a ListIterator which recursively traverses all children and their children etc. of this SpanList. * @see java.util.ListIterator */ @Override public ListIterator<SpanNode> childIteratorRecursive() { return new InvalidatingIterator(this, new RecursiveNodeIterator(children().listIterator())); }
@Override public SpanNode next() { if (stack.isEmpty() || !hasNext()) { iteratorFromLastCallToNext = null; throw new NoSuchElementException("No next element available."); } stack.peek().traversed = false; iteratorFromLastCallToNext = stack.peek(); return stack.peek().next(); }
@Override public boolean hasNext() { if (stack.isEmpty()) { return false; } PeekableListIterator<SpanNode> iterator = stack.peek(); if (!iterator.hasNext()) { stack.pop(); return hasNext(); } SpanNode node = iterator.peek(); if (!iterator.traversed) { //we set the traversed flag on our way down iterator.traversed = true; stack.push(new PeekableListIterator<SpanNode>(node.childIterator())); return hasNext(); } return true; }