Mercurial > hg > Members > shoshi > TreeCMSv1
changeset 1:9d7863f367bb
iterator
author | one |
---|---|
date | Fri, 27 Aug 2010 16:46:35 +0900 |
parents | f815c7c1fb38 |
children | ebf0e1a8c727 |
files | src/treecms/proto/test/PreOrderTreeWalker.java |
diffstat | 1 files changed, 28 insertions(+), 52 deletions(-) [+] |
line wrap: on
line diff
--- 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<NodeAPI> , Iterable<NodeAPI> +public class PreOrderTreeWalker implements Iterable<NodeAPI> { private NodeAPI m_root; - private LinkedList<Iterator<NodeAPI>> m_childs; - private int m_pos; public PreOrderTreeWalker(NodeAPI _root) { m_root = _root; - m_childs = new LinkedList<Iterator<NodeAPI>>(); + } + + class IteratorState implements Iterator<NodeAPI> { + LinkedList<LinkedList<NodeAPI>>stack = new LinkedList<LinkedList<NodeAPI>>(); + LinkedList<NodeAPI>children; - for(NodeAPI child : _root.getChildList()){ - m_childs.add((new PreOrderTreeWalker(child)).iterator()); + IteratorState(NodeAPI root) { + children = new LinkedList<NodeAPI>(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<NodeAPI>(next.getChildList()); + return next; + } + public void remove() { + } } @Override public Iterator<NodeAPI> 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 - - } }