1. 程式人生 > >java建立樹形結構

java建立樹形結構

TreeUtil

package com.shop.prise.common.utils;

import com.shop.prise.common.model.Node;

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

/**
 * descript:
 * creat by on 2018/9/27
 */
public class TreeUtil {
    // 入口方法
    public static List<Node> getTree(List<Node> nodeList) {
        List<Node> list = new ArrayList<Node>();
        // 遍歷節點列表
        for (Node node : nodeList) {
            if (node.getParentId().equals("-1")) {
                // parentID為-1(根節點)作為入口
                node.setChildren( getChildrenNode(node.getId(), nodeList));
                list.add(node);
            }
        }
        return list;
    }

    // 獲取子節點的遞迴方法
    private static List<Node> getChildrenNode(String id, List<Node> nodeList) {
        List<Node> list = new ArrayList<Node>();
        for (Node node : nodeList) {
            if (node.getParentId().equals(id)) {
                // 遞迴獲取子節點
                node.setChildren(getChildrenNode(node.getId(), nodeList));
                list.add(node);
            }
        }
        return list;
    }
}

Node

package com.shop.prise.common.model;

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

/**
 * descript:
 * creat by on 2018/9/27
 */
public class Node {
    private String id;
    private String name;
    private String parentId;
    //private int order;
    private List<Node> children = new ArrayList<Node>();

    public Node() {

    }

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

    public String getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getParentId() {
        return parentId;
    }

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

    /*public int getOrder() {
        return order;
    }

    public void setOrder(int order) {
        this.order = order;
    }*/

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

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

Children

package com.shop.prise.common.model;

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

/**
 * descript:
 * creat by zhiyu on 2018/9/27
 */
public class Children {

    private List<Node> list = new ArrayList<Node>();
    // ...get set 方法,構造方法
    public List<Node> getList() {
        return list;
    }

    public void setList(List<Node> list) {
        this.list = list;
    }
    public int getSize() {
        return list.size();
    }
    public void addChild(Node node) {
        list.add(node);
    }

}

使用

//查詢所有分類
List<GoodsCategory> queryList = goodsCategoryMapper.getAllGoodsCategory();
List<Node> nodeList = new ArrayList<>();
for (GoodsCategory goodsCategory :queryList){
    nodeList.add(new Node(goodsCategory.getId(), goodsCategory.getName(), goodsCategory.getParentId()));
}
List<Node> nodeTree = TreeUtil.getTree(nodeList);

以上就是樹形結構的生成了
下面說說怎麼解析樹了

/**
     * TODO: 將樹的所有id取出來
     * 我們利用sql的in查詢即可查出該分類下的商品了
     * @return
     * @author 
     * @date 2018/10/11 19:12
     */
    private List<String> getCategoryIds(String id) {
        //查詢所有分類
        List<GoodsCategory> queryList = goodsCategoryMapper.getAllGoodsCategory();
        List<Node> nodeList = new ArrayList<>();
        for (GoodsCategory goodsCategory : queryList) {
            nodeList.add(new Node(goodsCategory.getId(), goodsCategory.getName(), goodsCategory.getParentId()));
        }
        //獲取該分類下所有子分類並拼接成樹
        nodeList = TreeUtil.getTree(nodeList, id);
        System.out.println(JsonUtils.objectToJson(nodeList));
        recursion(nodeList);
        return cList;
    }

    /**
     * TODO: 遞迴查詢子分類
     *
     * @return
     * @author 
     * @date 2018/10/11 19:33
     */
    private Node recursion(List<Node> root) {
        if (root == null) {
            return null;
        } else {
            Node nodeResult = null;
            for (Node node : root) {
                cList.add(node.getId());
                //如果有子分類繼續查詢
                if (hasChild(node)) {
                    nodeResult = recursion(node.getChildren());
                }
            }
            return nodeResult;
        }
    }

    /**
     * TODO: 判斷樹是否有子節點
     *
     * @return
     * @author 
     * @date 2018/10/11 19:13
     */
    private boolean hasChild(Node root) {
        boolean has = false;
        if (root != null && root.getChildren() != null && !root.getChildren().isEmpty()) {
            has = true;
        }
        return has;
    }