view 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 source

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

	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");
		}
		
	}
}