根据拉平的树递归生成层次结构的树

代码:

/**
 * Copyright © 2016 my. All rights reserved.
 */
package com.mycompay.mysystem;

import java.util.List;

import org.apache.commons.lang3.StringUtils;

import com.alibaba.fastjson.JSON;
import com.google.common.base.Predicate;
import com.google.common.base.Strings;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;

/**
 * 根据拉平的树递归生成层次结构的树
 * 
 * @author James 2016年11月14日 下午11:42:12
 *
 */
public class GenTree {

	/**
	 * 根据父节点获取所有子节点 如果父节点为null,则返回根节点
	 * 
	 * @param node
	 * @return
	 */
	private static List<TreeNode> getChildNodes(final TreeNode parentNode,
			List<TreeNode> allNodes) {
		// 这里约定传入父节点为null就是查根节点
		Predicate<TreeNode> predicate = null;
		if (null == parentNode) {
			// 约定ParentNodeNo为 null,""是跟节点
			predicate = new Predicate<TreeNode>() {
				public boolean apply(TreeNode treeNode) {
					return Strings.isNullOrEmpty(treeNode.getParentNodeNo());
				}
			};
		} else {
			predicate = new Predicate<TreeNode>() {
				// 查询子节点
				public boolean apply(TreeNode treeNode) {
					return StringUtils.equals(parentNode.getNodeNo(),
							treeNode.getParentNodeNo());
				}
			};
		}
		return Lists.newArrayList(Iterables.filter(allNodes, predicate));

	}

	/**
	 * 根据父节点递归生成树
	 * 
	 * @param parentNode
	 * @return
	 */
	private static TreeNode recurGenTree(TreeNode parentNode,
			List<TreeNode> allNodes) {
		// 查询子节点
		List<TreeNode> childNodes = getChildNodes(parentNode, allNodes);
		// 遍历子节点
		for (TreeNode child : childNodes) {
			TreeNode node = recurGenTree(child, allNodes);
			parentNode.getChildNodes().add(node);
		}
		return parentNode;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		List<TreeNode> tree = Lists.newArrayList();

		// 第一颗课树
		tree.add(new TreeNode("1", "A", ""));
		tree.add(new TreeNode("2", "B", "1"));
		tree.add(new TreeNode("3", "C", "2"));
		tree.add(new TreeNode("4", "D", "3"));
		tree.add(new TreeNode("5", "E", "1"));
		tree.add(new TreeNode("6", "F", "2"));

		// 第二课树
		tree.add(new TreeNode("11", "AA", ""));
		tree.add(new TreeNode("22", "BB", "11"));
		tree.add(new TreeNode("33", "CC", "22"));
		tree.add(new TreeNode("44", "DD", "33"));
		tree.add(new TreeNode("55", "EE", "11"));
		tree.add(new TreeNode("66", "FF", "22"));
		tree.add(new TreeNode("77", "GG", "66"));
		tree.add(new TreeNode("88", "HH", "77"));
		tree.add(new TreeNode("99", "II", "88"));

		// 查询根节点
		List<TreeNode> roots = getChildNodes(null, tree);
		for (TreeNode node : roots) {
			recurGenTree(node, tree);
		}

		for (TreeNode node : roots) {
			System.out.println(JSON.toJSONString(node));
		}

	}

}

/**
 * 拉平的树 对应数据库中一条记录
 * 
 * @author James 2016年11月14日 下午11:45:50
 *
 */
class TreeNode {

	public TreeNode(String nodeNo, String nodeCode, String parentNodeNo) {
		super();
		this.nodeNo = nodeNo;
		this.nodeCode = nodeCode;
		this.parentNodeNo = parentNodeNo;
	}

	/**
	 * 节点唯一编号
	 */
	private String nodeNo;

	/**
	 * 节点编码
	 */
	private String nodeCode;

	/**
	 * 父节点编码
	 */
	private String parentNodeNo;

	private List<TreeNode> childNodes = Lists.newArrayList();

	/**
	 * 根据元数据递归生成到达节点路径
	 */
	private String path;

	/**
	 * @return the nodeNo
	 */
	public String getNodeNo() {
		return nodeNo;
	}

	/**
	 * @param nodeNo
	 *            the nodeNo to set
	 */
	public void setNodeNo(String nodeNo) {
		this.nodeNo = nodeNo;
	}

	/**
	 * @return the nodeCode
	 */
	public String getNodeCode() {
		return nodeCode;
	}

	/**
	 * @param nodeCode
	 *            the nodeCode to set
	 */
	public void setNodeCode(String nodeCode) {
		this.nodeCode = nodeCode;
	}

	/**
	 * @return the parentNodeNo
	 */
	public String getParentNodeNo() {
		return parentNodeNo;
	}

	/**
	 * @param parentNodeNo
	 *            the parentNodeNo to set
	 */
	public void setParentNodeNo(String parentNodeNo) {
		this.parentNodeNo = parentNodeNo;
	}

	/**
	 * @return the path
	 */
	public String getPath() {
		return path;
	}

	/**
	 * @param path
	 *            the path to set
	 */
	public void setPath(String path) {
		this.path = path;
	}

	/**
	 * @return the childNodes
	 */
	public List<TreeNode> getChildNodes() {
		return childNodes;
	}

	/**
	 * @param childNodes
	 *            the childNodes to set
	 */
	public void setChildNodes(List<TreeNode> childNodes) {
		this.childNodes = childNodes;
	}

}

输出结果:

{"childNodes":[{"childNodes":[{"childNodes":[{"childNodes":[],"nodeCode":"D","nodeNo":"4","parentNodeNo":"3"}],"nodeCode":"C","nodeNo":"3","parentNodeNo":"2"},{"childNodes":[],"nodeCode":"F","nodeNo":"6","parentNodeNo":"2"}],"nodeCode":"B","nodeNo":"2","parentNodeNo":"1"},{"childNodes":[],"nodeCode":"E","nodeNo":"5","parentNodeNo":"1"}],"nodeCode":"A","nodeNo":"1","parentNodeNo":""}

{"childNodes":[{"childNodes":[{"childNodes":[{"childNodes":[],"nodeCode":"DD","nodeNo":"44","parentNodeNo":"33"}],"nodeCode":"CC","nodeNo":"33","parentNodeNo":"22"},{"childNodes":[{"childNodes":[{"childNodes":[{"childNodes":[],"nodeCode":"II","nodeNo":"99","parentNodeNo":"88"}],"nodeCode":"HH","nodeNo":"88","parentNodeNo":"77"}],"nodeCode":"GG","nodeNo":"77","parentNodeNo":"66"}],"nodeCode":"FF","nodeNo":"66","parentNodeNo":"22"}],"nodeCode":"BB","nodeNo":"22","parentNodeNo":"11"},{"childNodes":[],"nodeCode":"EE","nodeNo":"55","parentNodeNo":"11"}],"nodeCode":"AA","nodeNo":"11","parentNodeNo":""}

 

转载于:https://my.oschina.net/phridem/blog/787832

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值