Mercurial > hg > Members > shoshi > TreeCMSv2
diff src/treecms/tree/util/PreorderTreewalker.java @ 3:5fa718b63cd5
finished treecms.memory basic implementation ( not tested yet. )
author | shoshi |
---|---|
date | Fri, 18 Feb 2011 02:14:10 +0900 |
parents | |
children | 12604eb6b615 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/treecms/tree/util/PreorderTreewalker.java Fri Feb 18 02:14:10 2011 +0900 @@ -0,0 +1,87 @@ +package treecms.tree.util; + +import java.util.Iterator; +import java.util.Stack; +import treecms.api.Node; + +public class PreorderTreewalker implements Iterable<Node> +{ + private Node m_root; + + public PreorderTreewalker(Node _root) + { + m_root = _root; + } + + + @Override + public Iterator<Node> iterator() + { + return new IteratorImpl(); + } + + private class IteratorImpl implements Iterator<Node> + { + private Stack<Pair<Node,Iterator<Node>>> m_depth; + private Node m_next; + + public IteratorImpl() + { + m_depth = new Stack<Pair<Node,Iterator<Node>>>(); + m_next = m_root; + m_depth.add(new Pair<Node,Iterator<Node>>(m_next,m_next.getData().list().iterator())); // ワケがわからないよ! + } + + @Override + public boolean hasNext() + { + return (m_next != null) ? true : false; + } + + @Override + public Node next() + { + Node next = m_next; + + //forward. + Pair<Node,Iterator<Node>> context = m_depth.peek(); + Iterator<Node> itr = context.m_right; + if(itr.hasNext()){ + m_next = itr.next(); + m_depth.add(new Pair<Node,Iterator<Node>>(m_next,m_next.getData().list().iterator())); // ワケがわからないよ! + }else{ + m_depth.pop(); + while(!m_depth.isEmpty()){ + Pair<Node,Iterator<Node>> back = m_depth.peek(); + if(back.m_right.hasNext()){ + m_next = back.m_right.next(); + break; + } + m_depth.pop(); + } + m_next = null; + } + + return next; + } + + @Override + public void remove() + { + //not supported. + } + } + + private class Pair<L,R> + { + @SuppressWarnings("unused") + public L m_left; + public R m_right; + + public Pair(L _left,R _right) + { + m_left = _left; + m_right = _right; + } + } +}