zoukankan      html  css  js  c++  java
  • java—将数据库读取的list转tree

    一、引言

    有时候我们从数据库中读取出了一个表的数据,比如存储的是中国的省市县的ID、名称与父节点ID,读出来的数据并不是前台想要的,这个时候我们要想法处理一下都出来的list,将它变为一个树。

    比如直接查出来是图(1)的数据,我们要的效果是图(2)的数据

    图(1)

    图(2)

    二、使用过程

    1、新建TreeNode实体类,对应数据库中的数据

    public class TreeNode{  
        private String id;//本节点id
        private String name;//本节点名称
        private String parentId;//本节点的父节点
        private List<TreeNode> children;
    	
    	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 List<TreeNode> getChildren() {
    		return children;
    	}
    	public void setChildren(List<TreeNode> children) {
    		this.children = children;
    	}
    } 
    

    2、新建TreeUtil类处理list(分别使用两层遍历与递归的方法实现)

    public class TreeUtil {
     
    	  /** 
         * 两层循环实现建树 
         * @param treeNodes 传入的树节点列表 
         * @return 
         */  
        public static List<TreeNode> bulid(List<TreeNode> treeNodes) {  
      
            List<TreeNode> trees = new ArrayList<TreeNode>();  
      
            for (TreeNode treeNode : treeNodes) {  
      
                if ("0".equals(treeNode.getParentId())) {  
                    trees.add(treeNode);  
                }  
      
                for (TreeNode it : treeNodes) {  
                    if (it.getParentId().equals(treeNode.getId()) ) {  
                        if (treeNode.getChildren() == null) {  
                            treeNode.setChildren(new ArrayList<TreeNode>());  
                        }  
                        treeNode.getChildren().add(it);  
                    }  
                }  
            }  
            return trees;  
        }  
      
        /** 
         * 使用递归方法建树 
         * @param treeNodes 
         * @return 
         */  
        public static List<TreeNode> buildByRecursive(List<TreeNode> treeNodes) {  
            List<TreeNode> trees = new ArrayList<TreeNode>();  
            for (TreeNode treeNode : treeNodes) {  
                if ("0".equals(treeNode.getParentId())) {  
                    trees.add(findChildren(treeNode,treeNodes));  
                }  
            }  
            return trees;  
        }  
      
        /** 
         * 递归查找子节点 
         * @param treeNodes 
         * @return 
         */  
        public static TreeNode findChildren(TreeNode treeNode,List<TreeNode> treeNodes) {  
        	treeNode.setChildren(new ArrayList<TreeNode>());
            for (TreeNode it : treeNodes) {  
                if(treeNode.getId().equals(it.getParentId())) {  
                    if (treeNode.getChildren() == null) {  
                        treeNode.setChildren(new ArrayList<TreeNode>());  
                    }  
                    treeNode.getChildren().add(findChildren(it,treeNodes));  
                }  
            }  
            return treeNode;  
        }  
    }
    
    

    3、将数据库中的数据保存到list数组中,调用TreeUtil中的处理函数

    调用递归方法

    TreeUtil.buildByRecursive(menuList);
    

    调用两层遍历的方法

    TreeUtil.bulid(menuList);
    

    转载自:https://blog.csdn.net/xcymorningsun/article/details/79254819

  • 相关阅读:
    什么是Azkaban?
    设计模式 应用场景
    初识Nginx
    C++著名程序库的比较和学习经验(STL.Boost.GUI.XML.网络等等)
    C++对象模型笔记之程序设计模型
    深度探索C++对象模型之C++对象模型笔记
    对于数据库设计者而言,在设计表属性类型时应该考虑哪些问题?
    Thread 多线程 同步
    Thread sleep()休眠
    Java 多线程(Thread)学习
  • 原文地址:https://www.cnblogs.com/JohnDawson/p/11175161.html
Copyright © 2011-2022 走看看