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;
    }

猜你喜欢

转载自blog.csdn.net/baidu_35813686/article/details/82863596