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

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

 

       原始数据结构:

       ID,PID,NAME....

       目标数据(json):

       {

            id:1

            name:'NAME1',

            children:[

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

            ]

       }

 

好了,直接上代码先。

Java代码  收藏代码
  1. /** 
  2.  * 快速构建树结构 
  3.  *  
  4.  * 非递归,使用2次循环完成构建。 
  5.  * @author zhangpu 
  6.  * 
  7.  */  
  8. public class QuickTreeBuilder {  
  9.   
  10.     public static void main(String[] args) {  
  11.         // 构建原始数据:这里为了简便,原始数据集合使用的也是Node对象,  
  12.         // 实际情况可以是其他任意entity,只需要在后面构建树时进行转化就OK  
  13.         List<Node> orginals = new ArrayList<Node>();  
  14.         // parentId = 0 表示顶层,你也可以构建原始数据parentId=null是顶层,由你决定。  
  15.         for (int i = 1; i <= 5; i++) {  
  16.             orginals.add(new Node(i, i - 1, "name" + i));  
  17.         }  
  18.         // 构建一个Map,把所有原始数据的ID作为Key,原始数据对象作为VALUE  
  19.         Map<Integer, Node> dtoMap = new HashMap<Integer, Node>();  
  20.         for (Node node : orginals) {  
  21.             // 如果原始数据对象不是Node,这里就可以直接写个conver转化  
  22.             // 原始数据对象为Node,放入dtoMap中。  
  23.             dtoMap.put(node.getId(), node);  
  24.         }  
  25.   
  26.         List<Node> result = new ArrayList<Node>();  
  27.         for (Map.Entry<Integer, Node> entry : dtoMap.entrySet()) {  
  28.             Node node = entry.getValue();  
  29.             if (node.getParentId() == 0) {  
  30.                 // 如果是顶层节点,直接添加到结果集合中  
  31.                 result.add(node);  
  32.             } else {  
  33.                 // 如果不是顶层节点,找的起父节点,然后添加到父节点的子节点中  
  34.                 if (dtoMap.get(node.getParentId()) != null) {  
  35.                     dtoMap.get(node.getParentId()).addChild(node);  
  36.                 }  
  37.             }  
  38.         }  
  39.   
  40.         // 如果有排序需求,可以在最后对输出的结构进行排序  
  41.         // 打印结果数据  
  42.         System.out.println(result);  
  43.   
  44.     }  
  45.   
  46.     static class Node {  
  47.         private int id;  
  48.         private int parentId;  
  49.         private String name;  
  50.         private List<Node> children = new ArrayList<Node>();  
  51.   
  52.         public Node() {  
  53.         }  
  54.   
  55.         public Node(int id, int parentId, String name) {  
  56.             super();  
  57.             this.id = id;  
  58.             this.parentId = parentId;  
  59.             this.name = name;  
  60.         }  
  61.   
  62.         public void addChild(Node node) {  
  63.             this.children.add(node);  
  64.         }  
  65.   
  66.         public int getId() {  
  67.             return id;  
  68.         }  
  69.   
  70.         public void setId(int id) {  
  71.             this.id = id;  
  72.         }  
  73.   
  74.         public int getParentId() {  
  75.             return parentId;  
  76.         }  
  77.   
  78.         public void setParentId(int parentId) {  
  79.             this.parentId = parentId;  
  80.         }  
  81.   
  82.         public String getName() {  
  83.             return name;  
  84.         }  
  85.   
  86.         public void setName(String name) {  
  87.             this.name = name;  
  88.         }  
  89.   
  90.         public List<QuickTreeBuilder.Node> getChildren() {  
  91.             return children;  
  92.         }  
  93.   
  94.         public void setChildren(List<QuickTreeBuilder.Node> children) {  
  95.             this.children = children;  
  96.         }  
  97.   
  98.         @Override  
  99.         public String toString() {  
  100.             return "{id:" + id + ", parentId:" + parentId + ", name:" + name + ", children:" + children + "}";  
  101.         }  
  102.   
  103.     }  
  104.   
  105. }  
posted @ 2017-05-29 11:26  天涯海角路  阅读(812)  评论(0)    收藏  举报