java 生成组织列表树(非递归)
生活随笔
收集整理的這篇文章主要介紹了
java 生成组织列表树(非递归)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在展示菜單列表或組織架構(gòu)等列表時(shí)經(jīng)常會通過樹型結(jié)構(gòu),以樹型結(jié)構(gòu)展示更加直觀。
實(shí)現(xiàn)樹最簡單的方式就是遞歸,該方式隨著樹的深度加深,時(shí)間復(fù)雜度o(n^m)也會指數(shù)型上升,輕則影響用戶體驗(yàn),重則導(dǎo)致系統(tǒng)崩潰。
以下為非遞歸方式,時(shí)間復(fù)雜度為o(n^2)。
實(shí)體類
/*** 組織實(shí)體類** @Author: MonsterTiny* @Date: 2021-04-23 11:49*/ @Data public class AreaVO {/*** 組織ID*/private String orgId;/*** 父組織ID*/private String orgParentId;//組織其他字段就不展示了/*** 子集*/private List<AreaVO> children; }生成樹的方法
/*** 生成組織樹** @param list * @param root 根節(jié)點(diǎn)id* @return*/public List<AreaVO> getTree(List<AreaVO> list, String root) {List<AreaVO> orgs = new ArrayList<>();Map<String, AreaVO> parentObjs = new HashMap<>();// 找出所有的一級菜單for (AreaVO areaVO : list) { if (areaVO.getOrgParentId().equals(root)) {orgs.add(areaVO);}// 記錄一級菜單的id及對應(yīng)的實(shí)體parentObjs.put(areaVO.getOrgId(), areaVO);}// 把每個(gè)組織加到父組織的子集中for (AreaVO areaVO : list) {// 如果是一級菜單,不需要找它的父級if (areaVO.getOrgParentId().equals(root)) {continue;}// 每個(gè)組織找到自己的直接父級,并加入到父級的子集中AreaVO parentObj = parentObjs.get(areaVO.getOrgParentId());// 如果還沒有子組織集合,新建一個(gè)集合并添加子組織if (Objects.isNull(parentObj.getChildren())) {parentObj.setChildren(new ArrayList<>());}parentObj.getChildren().add(areaVO);}return orgs;}總結(jié)
以上是生活随笔為你收集整理的java 生成组织列表树(非递归)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot开启redis共享s
- 下一篇: springboot 并发执行定时任务