• 整理树形结构数据


    整理树形结构数据


    树形结构是一种常见的数据组织结构:


    今天恰好需要完成一个接口,将数据组织长树形结构,下面是简化的代码:

    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import java.util.List;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class Node {
        /**
         * 当前节点ID
         */
        private String id;
        /**
         * 当前节点名称
         */
        private String name;
        /**
         * 父节点ID
         */
        private String parentId;
        /**
         * 子节点列表
         */
        private List<Node> childNodeList;
    }
    
    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.List;
    
    /**
     * @author xzy
     * @date 2020-06-30 10:39
     * 说明:
     */
    public class TreeBuilder {
        /**
         * 构造森林
         *
         * @param nodeList - 森林中的所有节点
         * @return - 使用给定节点构造出来的森林
         */
        public List<Node> buildForest(List<Node> nodeList) {
            //所有树的根节点
            List<Node> rootNodeList = new LinkedList<>();
    
            // 遍历所有节点,找出所有树根节点,然后构建每棵树。
            nodeList.forEach(node -> {
                if (isRootNode(node)) {
                    node.setChildNodeList(buildTree(node.getId(), nodeList));
                    rootNodeList.add(node);
                }
            });
    
            return rootNodeList;
        }
    
        /**
         * 判断给定节点是否为树根节点
         *
         * @param node - 待判断的节点
         * @return true:是 false:否
         */
        private boolean isRootNode(Node node) {
            //若父节点ID的值为null或者“”,则认为节点没有父节点,即节点是树根节点
            return "".equals(node.getParentId()) || node.getParentId() == null;
        }
    
        /**
         * 构建树
         *
         * @param rootNodeId - 根节点ID
         * @param nodeList   - 森林中的所有节点
         * @return - 以给定节点为根的一棵树
         */
        List<Node> buildTree(String rootNodeId, List<Node> nodeList) {
            List<Node> subTree = new LinkedList<>();
            nodeList.forEach(node -> {
                if (rootNodeId.equals(node.getParentId())) {
                    node.setChildNodeList(buildTree(node.getId(), nodeList));
                    subTree.add(node);
                }
            });
            return subTree;
        }
    
        /**
         * 构造森林
         *
         * @param rootNodeId - 树节点ID
         * @param nodeList   - 树节点列表
         */
        public List<Node> buildForest(String rootNodeId, List<Node> nodeList) {
            //所有树的根节点
            List<Node> rootNodeList = new LinkedList<>();
    
            // 遍历所有节点,找出所有树根节点,然后构建每棵树。
            if ("".equals(rootNodeId) || rootNodeId == null) {
                nodeList.forEach(node -> {
                    if (isRootNode(node)) {
                        node.setChildNodeList(buildForest(node.getId(), nodeList));
                        rootNodeList.add(node);
                    }
                });
            } else {
                nodeList.forEach(node -> {
                    if (rootNodeId.equals(node.getParentId())) {
                        node.setChildNodeList(buildForest(node.getId(), nodeList));
                        rootNodeList.add(node);
                    }
                });
            }
            return rootNodeList;
        }
    
        
        public static void main(String[] args) {
            Node node1 = new Node("1", "node1", "", null);
            Node node11 = new Node("11", "node11", "1", null);
            Node node111 = new Node("111", "node111", "11", null);
            Node node112 = new Node("112", "node112", "11", null);
            Node node113 = new Node("113", "node113", "11", null);
            Node node12 = new Node("12", "node12", "1", null);
            Node node121 = new Node("121", "node121", "12", null);
            Node node122 = new Node("122", "node122", "12", null);
            Node node123 = new Node("123", "node123", "12", null);
    
            Node node2 = new Node("2", "node2", "", null);
            Node node21 = new Node("21", "node21", "2", null);
            Node node22 = new Node("22", "node22", "2", null);
    
            List<Node> nodeList = new ArrayList<>();
            nodeList.add(node1);
            nodeList.add(node11);
            nodeList.add(node111);
            nodeList.add(node112);
            nodeList.add(node113);
            nodeList.add(node12);
            nodeList.add(node121);
            nodeList.add(node122);
            nodeList.add(node123);
            nodeList.add(node2);
            nodeList.add(node21);
            nodeList.add(node22);
    
            TreeBuilder treeBuilder = new TreeBuilder();
    
            nodeList = treeBuilder.buildForest(nodeList);
            nodeList = treeBuilder.buildForest("", nodeList);
        }
    }
    
  • 相关阅读:
    Struct2_使用Ajax调用Action方法并返回值
    Eclipse使用maven创建struct2项目及遇到的各种坑
    IIS7.5 提示未在本地计算机上注册“Microsoft.Jet.OleDb.4.0”提供程序
    使用Canvas实现下雪功能
    基于脚本的动画的计时控制(“requestAnimationFrame”)(转)
    pointer-events属性
    chrome Provisional headers are shown错误提示
    Wcf资料收集
    Asp.Net WebApi 启用CORS跨域访问指定多个域名
    Cors 跨域Access-Control-Allow-Origin
  • 原文地址:https://www.cnblogs.com/XiaoZhengYu/p/13215513.html
Copyright © 2020-2023  润新知