Mercurial > hg > Members > shoshi > TreeCMSv2
view 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 source
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; } } }