zoukankan      html  css  js  c++  java
  • Java递归获取树父节点下的所有树子节点

    1、实体类中添加集合属性

    private List<xxx> children=new ArrayList<>();

    一定要=new ArrayList<>(); 否则就等于该children没有引用,忘里面添加数据的时候会空指针的。

    2、dao层中有查询所有一级节点的方法

    <select id="findParentList" resultType="xxx">
    SELECT
      id,parent_id,code,name,xxx...
    from
      xxx
    where
        parent_id is null
    </select>
    

    比如这张表,一级节点的parent_id默认为null.

    3、service中添加如下代码

    private List<xxx> treeList = new ArrayList<>();  //全局变量
    
    @Override
    public List<xxx> getTree() {
        //先获取到所有数据
        treeList=xxxMapper.getList();   
        if(treeList==null) return null;
    
        //获取到所有一级节点
        List<xxx> parentList = this.xxxMapper.findParentList();
        List<xxx> list = new ArrayList<>();
        if(parentList != null){
            for (int i = 0; i < parentList.size(); i++) {
                list.add(recursiveTree(parentList.get(i).getId()));
            }
        }
        return list;
    }
    
    
    /**
     * 递归算法解析成树形结构
     * @param cid
     */
    public xxx recursiveTree(Integer cid) {
        xxx node = getXxxById(cid);
        List<xxx> childTreeNodes  = getChildTreeById(cid);
        for(xxx child : childTreeNodes){
            xxx n = recursiveTree(child.getId());
            node.getChildren().add(n);
        }
        return node;
    }
    
    /**
     * 根据CID查询节点对象
     */
    public xxx getXxxById(Integer cid){
        Map map =  getTreeMap();
        return (xxx) map.get(cid);
    }
    
    /**
     * 一次性取所有数据,为了减少对数据库查询操作
     * @return
     */
    public Map getTreeMap(){
        Map map =  new HashMap<Integer, xxx>();
        if(null != treeList){
            for(xxx d : treeList){
                map.put(d.getId(), d);
            }
        }
        return map;
    }
    
    /**
     * 根据父节点CID获取所有了节点
     */
    public List<xxx> getChildTreeById(Integer cid){
        List<xxx> list = new ArrayList<>();
        if(null != treeList){
            for (xxx d : treeList) {
                if(null != cid){
                    if (cid.equals(d.getParentId())) {
                        list.add(d);
                    }
                }
            }
        }
        return list;
    }
    

    获取到属性结构后,如何在页面显示树形表格,详见:AngularJS树形表格 -- tree-grid标签

  • 相关阅读:
    【C++】未定义的标识符“_TCHAR*”
    【C++】编写动态库DLL
    【C++】使用SQLite步骤及示例
    【VS】如何查询该项目是什么样工程类型
    新概念英语第一册单词
    地道情景表达一
    日常学习经典口语一
    全国省市区sql脚本
    关于Object.defineProperty
    响应式原理
  • 原文地址:https://www.cnblogs.com/VitoYi/p/7718260.html
Copyright © 2011-2022 走看看