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標簽


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM