`

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

阅读更多

 

       通过平铺的原始树形结构数据,快熟构建节点的父子管理,完成树型结构数据的构建,一般在配合前段树形机构显示中有特殊需求的情况中使用。如果需要提出一个父子结构数据中部分数据,如果利用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 + "}";
		}

	}

}

    

     

      

分享到:
评论

相关推荐

    决策树实现iris鸢尾花分类-C++

    决策树是一种基于树形结构的分类模型,它将特征空间划分为一系列非重叠的区域,并为每个区域分配一个标签。决策树的构建过程可以使用递归的方式实现。 我们定义了一个Node结构体来表示决策树的节点,其中feature_...

    使用词嵌入和递归神经网络在情感分析中利用上下文相似性-研究论文

    但是,这些意见数据只能以具有大量隐藏信息的非结构化格式获得。 情感分析是NLP中具有挑战性的任务之一,在NLP中,借助机器学习算法和语言建模,可以收集,处理和利用这些意见数据为用户提供更好的服务。 在本文中...

    IOI国家集训队论文集1999-2019

    + [树形DP](#树形dp) + [优化](#优化-1) * [计算几何](#计算几何) + [立体几何](#立体几何) + [计算几何思想](#计算几何思想) + [圆](#圆) + [半平面交](#半平面交) * [矩阵](#矩阵) + [矩阵](#矩阵-1) + ...

    JAVA上百实例源码以及开源项目源代码

     这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 ...

    PL/SQL Developer8.04官网程序_keygen_汉化

     可配置的树形浏览能够显示同PL/SQL开发相关的全部信息,使用该浏览器可以获取对象描述、浏览对象定义、创建测试脚本以便调试、使能或禁止触发器或约束条件、重新编译不合法对象、查询或编辑表格、浏览数据、在对象...

    PLSQLDeveloper下载

    对象浏览器——可配置的树形浏览能够显示同PL/SQL开发相关的全部信息,使用该浏览器可以获取对象描述、浏览对象定义、创建测试脚本以便调试、使能或禁止触发器或约束条件、重新编译不合法对象、查询或编辑表格、浏览...

    JAVA上百实例源码以及开源项目

     这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 ...

    java源码包---java 源码 大量 实例

     这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 ...

    java源码包2

     这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 ...

    java源码包3

     这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 ...

    java源码包4

     这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 ...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理 这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理 这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失...

Global site tag (gtag.js) - Google Analytics