1.定义测试数据类 VirtualDataGenerator;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class VirtualDataGenerator {
  public static List getVirtualResult() {
    List dataList = new ArrayList();

    HashMap dataRecord1 = new HashMap();
    dataRecord1.put("id", "112000");
    dataRecord1.put("name", "廊坊银行解放道支行");
    dataRecord1.put("parentId", "110000");

    HashMap dataRecord2 = new HashMap();
    dataRecord2.put("id", "112200");
    dataRecord2.put("name", "廊坊银行三大街支行");
    dataRecord2.put("parentId", "112000");

    HashMap dataRecord3 = new HashMap();
    dataRecord3.put("id", "112100");
    dataRecord3.put("name", "廊坊银行广阳道支行");
    dataRecord3.put("parentId", "112000");

    HashMap dataRecord4 = new HashMap();
    dataRecord4.put("id", "113000");
    dataRecord4.put("name", "廊坊银行开发区支行");
    dataRecord4.put("parentId", "110000");

    HashMap dataRecord5 = new HashMap();
    dataRecord5.put("id", "100000");
    dataRecord5.put("name", "廊坊银行总行");
    dataRecord5.put("parentId", "");

    HashMap dataRecord6 = new HashMap();
    dataRecord6.put("id", "110000");
    dataRecord6.put("name", "廊坊分行");
    dataRecord6.put("parentId", "100000");

    HashMap dataRecord7 = new HashMap();
    dataRecord7.put("id", "111000");
    dataRecord7.put("name", "廊坊银行金光道支行");
    dataRecord7.put("parentId", "110000");

    dataList.add(dataRecord1);
    dataList.add(dataRecord2);
    dataList.add(dataRecord3);
    dataList.add(dataRecord4);
    dataList.add(dataRecord5);
    dataList.add(dataRecord6);
    dataList.add(dataRecord7);

    return dataList;
  }
}

2.定义节点类 Node;

public class Node {
  /**
  * 节点内容
  */
  public String name;

  /**
  * 父节点编号
  */
  public String parentId;

  /**
  * 孩子节点列表
  */
  private Children children = new Children();

  // 先序遍历,拼接JSON字符串
  public String toString() {
    String result = "{" + "id : '" + id + "'" + ", name : '" + name + "'";

    if (children != null && children.getSize() != 0) {
      result += ", children : " + children.toString();
    } else {
      result += ", leaf : true";
    }

    return result + "}";
  }

  // 兄弟节点横向排序
  public void sortChildren() {
    if (children != null && children.getSize() != 0) {
      children.sortChildren();
    }
  }

  // 添加孩子节点
  public void addChild(Node node) {
    this.children.addChild(node);
  }
}

3.定义孩子类 Children;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

public class Children {

  private List list = new ArrayList();

  public int getSize() {
    return list.size();
  }

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

  // 拼接孩子节点的JSON字符串
  public String toString() {
    String result = "[";
    for (Iterator it = list.iterator(); it.hasNext();) {
      result += ((Node) it.next()).toString();
      result += ",";
    }
    result = result.substring(0, result.length() - 1);
    result += "]";
    return result;
  }

  // 孩子节点排序
  public void sortChildren() {
    // 对本层节点进行排序
    // 可根据不同的排序属性,传入不同的比较器,这里传入ID比较器
    Collections.sort(list, new NodeIDComparator());
    // 对每个节点的下一层节点进行排序
    for (Iterator it = list.iterator(); it.hasNext();) {
      ((Node) it.next()).sortChildren();
    }
  }
}

/**
* 节点比较器
*/
class NodeIDComparator implements Comparator {
  // 按照节点编号比较
  public int compare(Object o1, Object o2) {
    int j1 = Integer.parseInt(((Node) o1).id);
    int j2 = Integer.parseInt(((Node) o2).id);
    return (j1 < j2 ? -1 : (j1 == j2 ? 0 : 1));
  }
}

4.最后添加测试类进行测试 Test;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Test {
  public static void main(String[] args) {
    // 读取层次数据结果集列表
    List dataList = VirtualDataGenerator.getVirtualResult();
    // 节点列表(散列表,用于临时存储节点对象)
    HashMap nodeList = new HashMap();
    // 根节点
    Node root = null;
    // 根据结果集构造节点列表(存入散列表)
    for (Iterator it = dataList.iterator(); it.hasNext();) {
      Map dataRecord = (Map) it.next();
      Node node = new Node();
      node.id = (String) dataRecord.get("id");
      node.name = (String) dataRecord.get("name");
      node.parentId = (String) dataRecord.get("parentId");
      nodeList.put(node.id, node);
    }
    // 构造无序的多叉树
    Set entrySet = nodeList.entrySet();
    for (Iterator it = entrySet.iterator(); it.hasNext();) {
      Node node = (Node) ((Map.Entry) it.next()).getValue();
      if (node.parentId == null || node.parentId.equals("")) {
        root = node;
      } else {
        ((Node) nodeList.get(node.parentId)).addChild(node);
      }
    }
    // 输出无序的树形菜单的JSON字符串
    System.out.println(root.toString());
    // 对多叉树进行横向排序
    root.sortChildren();
    // 输出有序的树形菜单的JSON字符串
    System.out.println(root.toString());
  }
}

java实现树状图的更多相关文章

  1. D3树状图给指定特性的边特别显示颜色

    D3作为前端图形显示的利器,功能之强,对底层技术细节要求相对比较多. 有一点,就是要理解其基本的数据和节点的匹配规则架构,即enter,update和exit原理,我前面的D3基础篇中有介绍过,不明白 ...

  2. D3树状图异步按需加载数据

    D3.js这个绘图工具,功能强大不必多说,完全一个Data Driven Document的绘图工具,用户可以按照自己的数据以及希望实现的图形,随心所欲的绘图. 图形绘制,D3默认采用的是异步加载,但 ...

  3. SqlServer-无限递归树状图结构设计和查询

    在现实生活中,公司的部门设计会涉及到很多子部门,然后子部门下面又存在子部门,形成类似判断的树状结构,比如说评论楼中楼的评论树状图,职位管理的树状图结构等等,实现类似的树状图数据结构是在开发中经常出现的 ...

  4. Android开源图表之树状图和饼状图的官方示例的整理

    最近由于工作需要,所以就在github上搜了下关于chart的三方框架 官方地址https://github.com/PhilJay/MPAndroidChart 由于工作需要我这里整理了一份Ecli ...

  5. [整理] ES5 词法约定文档树状图

    将ES5 词法说明整理为了树状图,方便查阅,请自行点开小图看大图:

  6. bzoj 4871: [Shoi2017]摧毁“树状图” [树形DP]

    4871: [Shoi2017]摧毁"树状图" 题意:一颗无向树,选两条边不重复的路径,删去选择的点和路径剩下一些cc,求最多cc数. update 5.1 : 刚刚发现bzoj上 ...

  7. java集合树状结构及源码

    java集合树状结构及源码 最近一直想看一下java集合的源码,毕竟平时用的比较多,但总是感觉是跟着习惯new出来一个对象,比如ArrayList,HashMap等等,所以就简单的看了一下,了解了一下 ...

  8. vue 树状图数据的循环 递归循环

    在main.js中注册一个子组件 在父组件中引用 树状图的数据格式 绑定一个数据传入子组件,子组件props接收数据 子组件中循环调用组件,就实现了递归循环

  9. ztree 文件夹类型的 树状图

    未套程序的源代码: 链接:http://pan.baidu.com/s/1nuHbxhf 密码:4aw2 已套程序的源代码: css样式: /*发布邮件 选择领导弹窗*/ .xuandao{ disp ...

随机推荐

  1. TYAttributedLabel——简单,强大的iOS属性文本控件

    本文转载至 http://www.mobile-open.com/2015/86578.html TYAttributedLabel 简单,强大的属性文本的控件(无需了解CoreText),支持图文混 ...

  2. 重写MFC窗口上的关闭按钮事件(SDI, MDI, Dialog)

    This piece of code demonstrate how to override WM_CLOSE event. 点击窗口关闭按钮,触发相关事件! 有时候,在MFC程序退出之前,我们通常会 ...

  3. VC利用调试寄存器实现硬件断点源码

    [文章标题]:VC利用调试寄存器实现硬件断点源码 [文章作者]:yhswwr(SilenceRet) [作者QQ]:3412259 [编写语言]:C++ [使用工具]:VS2008.VC++9 [本文 ...

  4. [sql异常]SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的

    //执行远程数据库表查询 SELECT * FROM OPENDATASOURCE('SQLOLEDB', 'Data Source=数据库地址;User ID=sa;password=sa' ).n ...

  5. 【十大算法实现之KNN】KNN算法实例(含测试数据和源码)

    KNN算法基本的思路是比较好理解的,今天根据它的特点写了一个实例,我会把所有的数据和代码都写在下面供大家参考,不足之处,请指正.谢谢! update:工程代码全部在本页面中,测试数据已丢失,建议去UC ...

  6. 反编译获取线上任何微信小程序源码(转)

    看到人家上线的小程序的效果,纯靠推测,部分效果在绞尽脑汁后能做出大致的实现,但是有些细节,费劲全力都没能做出来.很想一窥源码?查看究竟?看看大厂的前端大神们是如何规避了小程序的各种奇葩的坑?那么赶紧来 ...

  7. github上打包的样式为什么在预览的时候,出现404

    这是资源引用的问题 在这里主要是需要在dist的index.html文件内将"./static/css/style.css"改为"static/css/style.css ...

  8. 跟bWAPP学WEB安全(PHP代码)--SSL(Server-Side-Include)漏洞

    什么是Server-Side-Include漏洞 服务端包含漏洞是指发送指令到服务器,服务器会将指令运行完,把运行结果包含在返回文件中发送给你.利用这种漏洞可以获取服务端的信息甚至执行命令,这样的指令 ...

  9. 从浏览器输入URL到页面渲染的过程

    零.背景 一个web安全工程师在学习web安全和web渗透时候,非常有必要了解整个WEB工作过程. 一.输入URL 这里是最基本的知识:URL是URI的一种实际应用,URI统一资源表示符,URL统一资 ...

  10. Rails: could not connect to database postgres: FATAL: Peer authentication failed for user "username"

    /var/lib/pgsql/9.2/data/pg_hba.conf 打开之后找到 local all postgres/all peer 改成 local all postgres trust 保 ...