快速构建树形结构数据(非递归)

 

       通过平铺的原始树形结构数据,快熟构建节点的父子管理,完成树型结构数据的构建,一般在配合前段树形机构显示中有特殊需求的情况中使用。如果需要提出一个父子结构数据中部分数据,如果利用hibernate的级联查询,是很方面获取树形结构的全量,但要剔除部分数据就麻烦了,而且hinernate执行的时候是多个SQL,效率也差一些(不考虑缓存哈)。

 

       原始数据结构:

       ID,PID,NAME....

       目标数据(json):

       {

            id:1

            name:'NAME1',

            children:[

                {id:2,name:'name2',children:[...]}

            ]

       }

 

好了,直接上代码先。

/**
 * 快速构建树结构
 * 
 * 非递归,使用2次循环完成构建。
 * @author zhangpu
 *
 */
public class QuickTreeBuilder {

	public static void main(String[] args) {
		// 构建原始数据:这里为了简便,原始数据集合使用的也是Node对象,
		// 实际情况可以是其他任意entity,只需要在后面构建树时进行转化就OK
		List<Node> orginals = new ArrayList<Node>();
		// parentId = 0 表示顶层,你也可以构建原始数据parentId=null是顶层,由你决定。
		for (int i = 1; i <= 5; i++) {
			orginals.add(new Node(i, i - 1, "name" + i));
		}
		// 构建一个Map,把所有原始数据的ID作为Key,原始数据对象作为VALUE
		Map<Integer, Node> dtoMap = new HashMap<Integer, Node>();
		for (Node node : orginals) {
			// 如果原始数据对象不是Node,这里就可以直接写个conver转化
			// 原始数据对象为Node,放入dtoMap中。
			dtoMap.put(node.getId(), node);
		}

		List<Node> result = new ArrayList<Node>();
		for (Map.Entry<Integer, Node> entry : dtoMap.entrySet()) {
			Node node = entry.getValue();
			if (node.getParentId() == 0) {
				// 如果是顶层节点,直接添加到结果集合中
				result.add(node);
			} else {
				// 如果不是顶层节点,找的起父节点,然后添加到父节点的子节点中
				if (dtoMap.get(node.getParentId()) != null) {
					dtoMap.get(node.getParentId()).addChild(node);
				}
			}
		}

		// 如果有排序需求,可以在最后对输出的结构进行排序
		// 打印结果数据
		System.out.println(result);

	}

	static class Node {
		private int id;
		private int parentId;
		private String name;
		private List<Node> children = new ArrayList<Node>();

		public Node() {
		}

		public Node(int id, int parentId, String name) {
			super();
			this.id = id;
			this.parentId = parentId;
			this.name = name;
		}

		public void addChild(Node node) {
			this.children.add(node);
		}

		public int getId() {
			return id;
		}

		public void setId(int id) {
			this.id = id;
		}

		public int getParentId() {
			return parentId;
		}

		public void setParentId(int parentId) {
			this.parentId = parentId;
		}

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

		public List<QuickTreeBuilder.Node> getChildren() {
			return children;
		}

		public void setChildren(List<QuickTreeBuilder.Node> children) {
			this.children = children;
		}

		@Override
		public String toString() {
			return "{id:" + id + ", parentId:" + parentId + ", name:" + name + ", children:" + children + "}";
		}

	}

}

    

     

      

你可能感兴趣的:(非递归)