Java遞歸算法構造JSON樹形結構

1.前言

最近項目中有一個需求,數據庫中的菜單表是一個常見的id-pid結構,須要把它構建成樹形的JSON格式發送給第三方,寫出來以後感受也是很簡單的,核心代碼只有5行,重要的是思路要明確,這裏把源碼分享給你們。java

工程裏面使用了json-lib.jar這個包,做用是將List序列化成JSON。node

2.前言數據庫

package com.agileai.esb.smc.domain;
 
 
 
import java.util.*;
 
import net.sf.json.JSONArray;
 
public class TreeBuilder {
 
        
 
         List<TreeBuilder.Node> nodes = new ArrayList<TreeBuilder.Node>();
 
 
 
         public TreeBuilder(List<Node> nodes) {
 
                   super();
 
                   this.nodes= nodes;
 
         }
 
        
 
         /**
          * 構建JSON樹形結構
          * @return
          */
 
         public String buildJSONTree() {
 
                   List<Node> nodeTree = buildTree();
 
                   JSONArray jsonArray = JSONArray.fromObject(nodeTree);
 
                   return jsonArray.toString();
 
         }
 
        
 
         /**
          * 構建樹形結構
          * @return
          */
 
         public List<Node> buildTree() {
 
                   List<Node>treeNodes = new ArrayList<Node>();
 
                   List<Node>rootNodes = getRootNodes();
 
                   for (Node rootNode : rootNodes) {
 
                            buildChildNodes(rootNode);
 
                            treeNodes.add(rootNode);
 
                   }
 
                   return treeNodes;
 
         }
 
        
 
         /**
          * 遞歸子節點
          * @param node
          */
 
         public void buildChildNodes(Node node) {
 
       List<Node> children = getChildNodes(node); 
 
       if (!children.isEmpty()) {
 
            for(Node child : children) {
 
                     buildChildNodes(child);
 
            } 
 
            node.setMenus(children);
 
       }
 
         }
 
 
 
         /**
          * 獲取父節點下全部的子節點
          * @param nodes
          * @param pnode
          * @return
          */
 
         public List<Node> getChildNodes(Node pnode) {
 
                   List<Node>childNodes = new ArrayList<Node>();
 
                   for (Node n : nodes){
 
                            if (pnode.getId().equals(n.getPid())) {
 
                                     childNodes.add(n);
 
                            }
 
                   }
 
                   return childNodes;
 
         }
 
        
 
         /**
          * 判斷是否爲根節點
          * @param nodes
          * @param inNode
          * @return
          */
 
         public boolean rootNode(Node node) {
 
                   boolean isRootNode = true;
 
                   for (Node n : nodes){
 
                            if (node.getPid().equals(n.getId())) {
 
                                     isRootNode= false;
 
                                     break;
 
                            }
 
                   }
 
                   return isRootNode;
 
         }
 
        
 
         /**
          * 獲取集合中全部的根節點
          * @param nodes
          * @return
          */
 
         public List<Node> getRootNodes() {
 
                   List<Node>rootNodes = new ArrayList<Node>();
 
                   for (Node n : nodes){
 
                            if (rootNode(n)) {
 
                                     rootNodes.add(n);
 
                            }
 
                   }
 
                   return rootNodes;
 
         }
 
        
 
         public static class Node {
 
                  
 
                   private String id;
 
                   private String pid;
 
                   private String text;
 
                   private String url;
 
                   private List<Node> menus;
 
                  
 
                   public Node() {}
 
 
 
                   public Node(String id, String pid, String text, String url) {
 
                            super();
 
                            this.id =id;
 
                            this.pid =pid;
 
                            this.text =text;
 
                            this.url =url;
 
                   }
 
                  
 
                   public String getId() {
 
                            return id;
 
                   }
 
                   public void setId(String id) {
 
                            this.id =id;
 
                   }
 
                   public String getPid() {
 
                            return pid;
 
                   }
 
                   public void setPid(String pid) {
 
                            this.pid =pid;
 
                   }
 
                   public String getText() {
 
                            return text;
 
                   }
 
                   public void setText(String text) {
 
                            this.text =text;
 
                   }
 
                   public String getUrl() {
 
                            return url;
 
                   }
 
                   public void setUrl(String url) {
 
                            this.url =url;
 
                   }
 
                   public List<Node> getMenus() {
 
                            return menus;
 
                   }
 
                   public void setMenus(List<Node> menus) {
 
                            this.menus= menus;
 
                   }
 
         }
 
        
 
         public static void main(String[] args) {
 
                  
 
                   List<Node>nodes = new ArrayList<Node>();
 
                   Node p1 = new Node("01", "","01", "");
 
                   Node p6 = new Node("02", "","02", "");
 
                   Node p7 = new Node("0201", "02","0201", "");
 
                   Node p2 = new Node("0101", "01","0101", "");
 
                   Node p3 = new Node("0102", "01","0102", "");
 
                   Node p4 = new Node("010101", "0101","010101", "");
 
                   Node p5 = new Node("010102", "0101","010102", "");
 
                   Node p8 = new Node("03", "","03", "");
 
                   nodes.add(p1);
 
                   nodes.add(p2);
 
                   nodes.add(p3);
 
                   nodes.add(p4);
 
                   nodes.add(p5);
 
                   nodes.add(p6);
 
                   nodes.add(p7);
                   
                   nodes.add(p8);
                  
 
                   TreeBuilder treeBuilder = new TreeBuilder(nodes);
 
                   System.out.println(treeBuilder.buildJSONTree());
 
         }
 
}
相關文章
相關標籤/搜索