view src/treecms/proto/util/RandomSimpleTreeBuilder.java @ 36:9663c816e370

commit.
author suika6039
date Mon, 27 Dec 2010 21:08:43 +0900
parents src/treecms/proto/simple/RandomSimpleTreeBuilder.java@9d248304be96
children
line wrap: on
line source

package treecms.proto.util;

import java.util.Random;

import treecms.proto.api.Node;
import treecms.proto.simple.SimpleNode;

public class RandomSimpleTreeBuilder
{
	public static void main(String _args[])
	{
		SimpleNode root = RandomSimpleTreeBuilder.randomTree(2,2,3,3);
		print(0,root);
	}
	
	public static void print(int _indent,Node _parent)
	{
		for(int i = 0;i < _indent;i ++){
			System.out.print("\t");
		}
		System.out.println(_parent.getTitle());
		
		for(Node child : _parent.getChildren()){
			print(_indent + 1,child);
		}
	}
	
	public static SimpleNode randomTree(int _maxRow,int _maxCol)
	{
		return randomTree(0,0,_maxRow,_maxCol);
	}
	
	public static SimpleNode randomTree(int _minRow,int _minCol,int _maxRow,int _maxCol)
	{
		RandomSimpleTreeBuilder builder = new RandomSimpleTreeBuilder(_minRow,_minCol,_maxRow,_maxCol);
		return builder.generate();
	}
	
	private int m_minCol;
	private int m_maxRow,m_maxCol;
	
	private RandomSimpleTreeBuilder(int _minRow,int _minCol,int _maxRow,int _maxCol)
	{
		m_minCol = _minCol;
		m_maxRow = _maxRow;
		m_maxCol = _maxCol;
	}
	
	public SimpleNode generate()
	{
		SimpleNode root = new SimpleNode();
		root.setTitle("root");
		
		Random rand = new Random();
		int childs = m_minCol + rand.nextInt(m_maxCol)*(1 - m_minCol/(1 + m_maxCol));
		for(int i = 1;i < childs;i ++){
			SimpleNode child = (SimpleNode)root.addChild(new SimpleNode());
			child.setTitle("c"+i);
			generate(child,1,rand);
		}
		return root;
	}
	
	private void generate(SimpleNode _parent,int _row,Random _rand)
	{
		if(_row >= m_maxRow || _rand.nextInt(m_maxRow) == 0){
			return;
		}
		
		int childs = m_minCol + _rand.nextInt(m_maxCol)*(1 - m_minCol/(1 + m_maxCol));
		for(int i = 1;i < childs;i ++){
			SimpleNode child = (SimpleNode)_parent.addChild(new SimpleNode());
			child.setTitle(_parent.getTitle()+i);
			generate(child,_row + 1,_rand);
		}
	}
	
}