zoukankan      html  css  js  c++  java
  • Java List与树的互转

      平时工作中都会遇到包含层级关系的List数据转换成树形结构,或者数据已是树形结构了,需要我们处理成普通的单层list结构。以下代码均为本人实际开发所写代码,可能不是最优解、复杂度也比较高,在此和大家一起分享学习!
      注:该工具类支持将list转换成树/森林。可自行测试,有疑问或更优方案,可私聊我。
     
      TreeNode
    @Data
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public class TreeNode<T> {
    
        private String id;
    
        private String key;
    
        private String value;

       private String name; private String parentId; private String createName; private LocalDateTime createTime; private List<TreeNode<T>> children; private boolean hasParent = false; private boolean hasChildren = false; public void initChildren() { this.children = new ArrayList<>(); } }
    TreeUtil
    public class TreeUtil {
    
        protected TreeUtil() {
    
        }
    
        private final static String TOP_NODE_ID = "0";
    
    
    
        /**
         * 使用递归方法建树
         *
         * @param nodes
         * @return
         */
        public static List<TreeNode<T>> buildByRecursive(List<TreeNode<T>> nodes) {
            List<TreeNode<T>> trees = new ArrayList<>();
            for (TreeNode<T> treeNode : nodes) {
                if (TOP_NODE_ID.equals(treeNode.getParentId())) {
                    trees.add(findChildren(treeNode,nodes));
                }
            }
            return trees;
        }
    
        /**
         * 递归查找子节点
         *
         * @param treeNodes
         * @return
         */
        public static TreeNode<T> findChildren(TreeNode<T> treeNode, List<TreeNode<T>> treeNodes) {
            for (TreeNode<T> it : treeNodes) {
                if (treeNode.getId().equals(it.getParentId())) {
                    if (treeNode.getChildren() == null) {
                        treeNode.setChildren(new ArrayList<TreeNode<T>>());
                    }
                    treeNode.getChildren().add(findChildren(it, treeNodes));
                }
            }
            return treeNode;
        }
    
        public static void buildTrees(List<TreeNode<T>> trees, List<T> list) {
            list.forEach(entity -> {
                TreeNode<T> tree = new TreeNode<>();
                tree.setId(entity.getId());
                tree.setKey(entity.getId());
                tree.setValue(entity.getId());
                tree.setName(entity.getName());
                tree.setParentId(entity.getParentId());
                tree.setCreateTime(entity.getCreateTime());
                tree.setCreateName(entity.getCreateName());
                trees.add(tree);
            });
        }
    
        public static <T> List<TreeNode<T>> buildTreeList(List<TreeNode<T>> nodes) {
            if (nodes == null) {
                return null;
            }
            List<TreeNode<T>> topNodes = new ArrayList<>();
            //利用两层循环,组装树/森林结构
            nodes.forEach(first -> {
                String pid = first.getParentId();
                first.setHasParent(true);
                if (pid == null || TOP_NODE_ID.equals(pid)) {
                    topNodes.add(first);
                    first.setHasParent(false);
                } else {
                    boolean isExistPid = false;
                    for (TreeNode<T> temp : nodes) {
                        if (temp.getId().equals(pid)) {
                            isExistPid = true;
                        }
                    }
                    if (!isExistPid) {
                        topNodes.add(first);
                        first.setHasParent(false);
                    }
                }
                for (TreeNode<T> second : nodes) {
                    String id = second.getId();
                    if (id != null && id.equals(pid)) {
                        if (second.getChildren() == null) {
                            second.initChildren();
                        }
                        second.getChildren().add(first);
                        first.setHasParent(true);
                        second.setHasChildren(true);
                        second.setHasParent(true);
                        return;
                    }
                }
            });
            return topNodes;
        }
    
        public static <T> TreeNode<T> buildTree(List<TreeNode<T>> nodes) {
            if (nodes == null) {
                return null;
            }
            List<TreeNode<T>> topNodes = new ArrayList<>();
            //利用两层循环,组装树/森林结构
            nodes.forEach(first -> {
                String pid = first.getParentId();
                first.setHasParent(true);
                if (pid == null || TOP_NODE_ID.equals(pid)) {
                    topNodes.add(first);
                    first.setHasParent(false);
                } else {
                    boolean isExistPid = false;
                    for (TreeNode<T> temp : nodes) {
                        if (temp.getId().equals(pid)) {
                            isExistPid = true;
                        }
                    }
                    if (!isExistPid) {
                        topNodes.add(first);
                        first.setHasParent(false);
                    }
                }
                for (TreeNode<T> second : nodes) {
                    String id = second.getId();
                    if (id != null && id.equals(pid)) {
                        if (second.getChildren() == null) {
                            second.initChildren();
                        }
                        second.getChildren().add(first);
                        first.setHasParent(true);
                        second.setHasChildren(true);
                        second.setHasParent(true);
                        return;
                    }
                }
            });
            TreeNode<T> root = new TreeNode<>();
            root.setId("0");
            root.setParentId("");
            root.setHasParent(false);
            root.setHasChildren(true);
            root.setChildren(topNodes);
            root.setName("root");
            return root;
        }
    
    
        public static <T> List<TreeNode<T>> tree2List(List<TreeNode<T>>  treeList) {
            List<TreeNode<T>> list = new ArrayList<>();
            for (TreeNode<T> tree : treeList) {
                List<TreeNode<T>> child = tree.getChildren();
                list.add(tree);
                if (child != null && child.size() > 0) {
                    list.addAll(tree2List(child));
                    tree.setChildren(null);
                }
            }
            return list;
        }
    }
  • 相关阅读:
    集群临时重启
    elasticsearch索引目录设置
    elasticsearch索引路径规则
    spring boot 使用application.properties 进行外部配置
    ELASTICSEARCH健康red的解决
    Elasticsearch——使用_cat查看Elasticsearch状态
    vmstat命令
    ava Maven项目之Nexus私服搭建和版本管理应用
    android 2.2 videoView 诡异bug
    华为部分设备运行很卡的问题
  • 原文地址:https://www.cnblogs.com/JackpotHan/p/15796810.html
Copyright © 2011-2022 走看看