Mercurial > hg > Members > shoshi > TreeCMSv1
view src/treecms/proto/test/PreOrderTreeWalker.java @ 18:423a01ec2d32
findPath and cloneTree in PreorderTreewalker1 (not yet tested)
author | one |
---|---|
date | Mon, 30 Aug 2010 00:48:50 +0900 |
parents | 18f696e9fc1e |
children |
line wrap: on
line source
package treecms.proto.test; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import treecms.proto.api.NodeAPI; public class PreOrderTreeWalker implements Iterable<NodeAPI> { private NodeAPI m_root; public PreOrderTreeWalker(NodeAPI _root) { m_root = _root; } class NodeState { NodeAPI node; int position; NodeState(NodeAPI n,int p) { node = n; position = p; } } class IteratorState implements Iterator<NodeAPI> { LinkedList<NodeState>nodeStack; int position; NodeAPI current, next; IteratorState(NodeAPI root) { current = root; position = 0; nodeStack = new LinkedList<NodeState>(); } public boolean hasNext() { while (position>=current.getChildList().size()) { if (nodeStack.isEmpty()) return false; NodeState s = nodeStack.poll(); current = s.node; position = s.position; } next = current.getChildList().get(position++); if (! next.getChildList().isEmpty()) { nodeStack.addLast(new NodeState(current,position)); current = next; position = 0; } return true; } public NodeAPI next() { return next; } public void remove() { } } @Override public Iterator<NodeAPI> iterator() { return new IteratorState(m_root); } }