tree遞歸

實體類

/**
 * 科目類別菜單實體類
 */
@Entity
@Data
public class TypeMenu {
    @Id
    private String id;

    private String companyId;//所屬公司id

    private String name;//類別名稱

    private String parentId;//父類id

    private String url;//菜單url

    private int type;//菜單類型 0:預算費用 1:報銷費用

    @Transient
    private List<TypeMenu> children;//子菜單
}

方法體

public List<TypeMenu> findTree(String companyId, int type){
        List<TypeMenu> allMenus =  tmr.findByCompanyIdAndType(companyId, type);
        List<TypeMenu> rootMenu = new ArrayList<>();
        for(TypeMenu tm : allMenus){
            if("0".equals(tm.getParentId())){
                rootMenu.add(tm);
            }
        }
        for(TypeMenu tm : rootMenu){
            /* 獲取根節點下的所有子節點 使用getChild方法*/
            List<TypeMenu> childList = getChild(tm.getId(), allMenus);
            tm.setChildren(childList);//給根節點設置子節點
        }
        return rootMenu;
    }

獲取子節點方法

/**
     * 獲取子節點
     * @param id 父節點id
     * @param allMenu 所有菜單列表
     * @return 每個根節點下,所有子菜單列表
     */
    public List<TypeMenu> getChild(String id, List<TypeMenu> allMenu){
        //子菜單
        List<TypeMenu> childList = new ArrayList<>();
        for (TypeMenu tm : allMenu) {
            // 遍歷所有節點,將所有菜單的父id與傳過來的根節點的id比較
            //相等說明:爲該根節點的子節點。
            if(tm.getParentId().equals(id)){
                childList.add(tm);
            }
        }
        //遞歸
        for (TypeMenu nav : childList) {
            nav.setChildren(getChild(nav.getId(), allMenu));
        }
        //如果節點下沒有子節點,返回一個空List(遞歸退出)
        if(childList.size() == 0){
            return null;//return new ArrayList<>()
        }
        return childList;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章