递归例子(Java)

目标:把一个关系型数据库中<子,父>关系的并列型列表转换成为一个层级架构树。

DB:

parent node
------ -------
soft_1  staff_B 
soft_1 staff_C 
dev soft_1
dev soft_2
dev staff_A 
gm_A dev 
gm_A hr 
gm_A market 
hr staff_E 
soft_2  staff_D 
boss  gm_A 
NULL boss 

最终架构树:

bossgm_Adevsoft_1staff_B
    staff_C
   soft_2staff_D
   staff_A 
  market  
  hrstaff_E 

这种情况需要用到递归。


主程序:

FileOrganizationNode treeNode = new FileOrganizationNode();
List<FileOrganization> fileOrganizations = new ArrayList<FileOrganization>();
fileOrganizations = fileOrganizationService.findNodeByOrganizationName(organizationName, limit);
treeNode.setName(rootNode.getNodeName());
addTreeNode(treeNode, rootNode.getNodeName(), fileOrganizations);	// 递归插入子node
* fileOrganizations 就是上面的<子,父>列表,rootNode.getNodeName() 取值为"boss"。

FileOrganization(包含其它内容) / FileOrganizationNode(只有子、父名)

/**
 * 
 * file_organization
 * 
 * 组织上下级关系描述
 * 
 */
public class FileOrganization {
	private String nodeName;
	private String nodeParentName;
	...


public class FileOrganizationNode {
	private String name;
	private List<FileOrganizationNode> children;

addTreeNode方法:

	// 递归插入子node
	public void addTreeNode(FileOrganizationNode treeNode, String parentNode, List<FileOrganization> fileOrganizations) {
		final Integer DEF_VALUE = 20;
		List<FileOrganizationNode> childTreeNodes = new ArrayList<FileOrganizationNode>();
		
		for (FileOrganization fileOrganization:fileOrganizations) {
			if (parentNode.equals(fileOrganization.getNodeParentName())) {
				FileOrganizationNode childTreeNode = new FileOrganizationNode();
				childTreeNode.setName(fileOrganization.getNodeName());
				childTreeNode.setValue(DEF_VALUE);
				childTreeNode.setNodeType(fileOrganization.getNodeType());
				childTreeNodes.add(childTreeNode);
				
				// 通过传参childTreeNode串联递归
				addTreeNode(childTreeNode, fileOrganization.getNodeName(), fileOrganizations);
			}
		}
		if (!childTreeNodes.isEmpty()) {
			treeNode.setChildren(childTreeNodes);
		}
	}


treeNode内容:

   




参考:

递归例子(Javascript)http://blog.csdn.net/textboy/article/details/46544379



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值