diff src/treecms/proto/test/PreOrderTreeWalkerRecursive.java @ 13:3bccd745f2e2

bug fix
author shoshi
date Sun, 29 Aug 2010 12:07:03 +0900
parents 18f696e9fc1e
children
line wrap: on
line diff
--- a/src/treecms/proto/test/PreOrderTreeWalkerRecursive.java	Sun Aug 29 00:11:08 2010 +0900
+++ b/src/treecms/proto/test/PreOrderTreeWalkerRecursive.java	Sun Aug 29 12:07:03 2010 +0900
@@ -1,5 +1,90 @@
 package treecms.proto.test;
+import java.util.Iterator;
+import java.util.LinkedList;
+
+import treecms.proto.api.NodeAPI;
+
+public class PreOrderTreeWalkerRecursive implements Iterable<NodeAPI>
+{
+	private NodeAPI m_root;
+	
+	public PreOrderTreeWalkerRecursive(NodeAPI _root)
+	{
+		m_root = _root;
+	}
+
+	@Override
+	public Iterator<NodeAPI> iterator()
+	{
+		// TODO Auto-generated method stub
+		return new PreOrderRecursiveIterator(m_root);
+	}
 
-public class PreOrderTreeWalkerRecursive {
+	class PreOrderRecursiveIterator implements Iterator<NodeAPI>
+	{
+		private NodeAPI m_root;
+		private LinkedList<Iterator<NodeAPI>> m_itrList;
+		
+		private int m_pos;
+		
+		public PreOrderRecursiveIterator(NodeAPI _root)
+		{
+			m_root = _root;
+			m_itrList = new LinkedList<Iterator<NodeAPI>>();
+			for(NodeAPI child : m_root.getChildList()){
+				Iterator<NodeAPI> itr = new PreOrderRecursiveIterator(child);
+				m_itrList.add(itr);
+			}
+			
+			m_pos = -1;
+		}
+		
+		@Override
+		public boolean hasNext()
+		{
+			// TODO Auto-generated method stub
+			int pos = m_pos;
+			
+			if(pos < 0){
+				return true;
+			}
+			
+			while(pos < m_itrList.size()){
+				if(m_itrList.get(pos).hasNext()){
+					return true;
+				}
+				pos++;
+			}
+			
+			return false;
+		}
 
+		@Override
+		public NodeAPI next()
+		{
+			// TODO Auto-generated method stub
+			if(m_pos < 0){
+				m_pos ++;
+				return m_root;
+			}
+			
+			while(m_pos < m_itrList.size()){
+				NodeAPI next = m_itrList.get(m_pos).next();
+				if(next != null){
+					return next;
+				}
+				m_pos ++;
+			}
+			
+			return null;
+		}
+
+		@Override
+		public void remove()
+		{
+			// TODO Auto-generated method stub
+			throw new UnsupportedOperationException("cant remove from itrerator");
+		}
+		
+	}
 }