view src/treecms/proto/test/PreOrderTreeWalker.java @ 1:9d7863f367bb

iterator
author one
date Fri, 27 Aug 2010 16:46:35 +0900
parents f815c7c1fb38
children 7ede12c9a2e9
line wrap: on
line source

package treecms.proto.test;

import java.util.Iterator;
import java.util.LinkedList;

import treecms.proto.api.NodeAPI;

public class PreOrderTreeWalker implements Iterable<NodeAPI>
{
	private NodeAPI m_root;
	
	public PreOrderTreeWalker(NodeAPI _root)
	{
		m_root = _root;
	}
	
	class IteratorState implements Iterator<NodeAPI> {
		LinkedList<LinkedList<NodeAPI>>stack = new LinkedList<LinkedList<NodeAPI>>();
		LinkedList<NodeAPI>children;
		
		IteratorState(NodeAPI root) {
			children = new LinkedList<NodeAPI>(root.getChildList());
			stack.addLast(children);
		}

		public boolean hasNext() {
			while (children.isEmpty()) {
				if (stack.isEmpty()) return false;
				children = stack.getLast();
				stack.removeLast();
			}
			return true;
		}
		public NodeAPI next() {
			NodeAPI next = children.get(0);
			children.remove(0);
			stack.addLast(children);
			children = new LinkedList<NodeAPI>(next.getChildList());
			return next;
		}
		public void remove() {
		}
	}
	
	@Override
	public Iterator<NodeAPI> iterator() {
			return new IteratorState(m_root);
	}

	
}