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