# HG changeset patch # User one # Date 1282895195 -32400 # Node ID 9d7863f367bbcc64b56e09a511b6b2657711fae9 # Parent f815c7c1fb3858d674b04ba7be9e5bbfdef8666f iterator diff -r f815c7c1fb38 -r 9d7863f367bb src/treecms/proto/test/PreOrderTreeWalker.java --- a/src/treecms/proto/test/PreOrderTreeWalker.java Fri Aug 27 15:26:20 2010 +0900 +++ b/src/treecms/proto/test/PreOrderTreeWalker.java Fri Aug 27 16:46:35 2010 +0900 @@ -5,71 +5,47 @@ import treecms.proto.api.NodeAPI; -public class PreOrderTreeWalker implements Iterator , Iterable +public class PreOrderTreeWalker implements Iterable { private NodeAPI m_root; - private LinkedList> m_childs; - private int m_pos; public PreOrderTreeWalker(NodeAPI _root) { m_root = _root; - m_childs = new LinkedList>(); + } + + class IteratorState implements Iterator { + LinkedList>stack = new LinkedList>(); + LinkedListchildren; - for(NodeAPI child : _root.getChildList()){ - m_childs.add((new PreOrderTreeWalker(child)).iterator()); + IteratorState(NodeAPI root) { + children = new LinkedList(root.getChildList()); + stack.addLast(children); } - - m_pos = -2; + + 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(next.getChildList()); + return next; + } + public void remove() { + } } @Override public Iterator iterator() { - // TODO Auto-generated method stub - return this; + return new IteratorState(m_root); } - @Override - public boolean hasNext() { - // TODO Auto-generated method stub - int next = m_pos + 1; - - if(next < 0){ - return true; - } - - for(;next < m_childs.size();next ++){ - System.out.println(m_pos); - if(m_childs.get(next).hasNext()){ - return true; - } - } - - return false; - } - @Override - public NodeAPI next() { - // TODO Auto-generated method stub - m_pos++; - - if(m_pos < 0){ - return this.m_root; - } - - for(;m_pos < m_childs.size();m_pos ++){ - NodeAPI nextNode = m_childs.get(m_pos).next(); - if(nextNode != null){ - return nextNode; - } - } - - return null; - } - - @Override - public void remove() { - // TODO Auto-generated method stub - - } }