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;
+		}
+	}
+}