<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.4.6</version></dependency>
@Data@Accessors(chain = true)public class TreeDemo { private Integer id; private Integer parentId; private Integer level; private String levelName; private Integer isEfficient; private Integer isShow; private String createdBy; private Date createdDate; private String updatedBy; private Date updatedDate;}
import cn.hutool.core.lang.tree.Tree;import cn.hutool.core.lang.tree.TreeNodeConfig;import cn.hutool.core.lang.tree.TreeUtil;import cn.hutool.json.JSONUtil;import java.util.*;import java.util.function.Function;import java.util.stream.Collectors;/** * TODO 樹形結構測試 * @date 2021/12/22 11:41 */public class TestDemo { public static void main(String[] args) { List<TreeDemo> treeDemoList = new ArrayList<>(); treeDemoList=initTreeDemo(); // 1、將源數據轉化為樹 List<Tree<Integer>> build = transform(treeDemoList); //2、通過子節點查找父節點 List<TreeDemo> parentList = childToParent(treeDemoList,build); //3、通過父節點查找子節點 Tree<Integer> tree= parentToChile(build); } /** * 1:初始化數據 */ public static List<TreeDemo> initTreeDemo(){ List<TreeDemo> treeDemoList = new ArrayList<>(); TreeDemo treeDemo = new TreeDemo(); treeDemo.setId(1).setParentId(0).setLevel(1).setLevelName("A").setIsEfficient(1).setIsShow(1); TreeDemo treeDemo1 = new TreeDemo(); treeDemo1.setId(2).setParentId(1).setLevel(2).setLevelName("B").setIsEfficient(1).setIsShow(1); TreeDemo treeDemo2 = new TreeDemo(); treeDemo2.setId(3).setParentId(2).setLevel(3).setLevelName("C").setIsEfficient(1).setIsShow(1); TreeDemo treeDemo3 = new TreeDemo(); treeDemo3.setId(4).setParentId(3).setLevel(4).setLevelName("D").setIsEfficient(1).setIsShow(1); TreeDemo treeDemo4 = new TreeDemo(); treeDemo4.setId(5).setParentId(4).setLevel(5).setLevelName("E").setIsEfficient(1).setIsShow(1); TreeDemo treeDemo5 = new TreeDemo(); treeDemo5.setId(6).setParentId(0).setLevel(1).setLevelName("A1").setIsEfficient(1).setIsShow(1); TreeDemo treeDemo6 = new TreeDemo(); treeDemo6.setId(7).setParentId(6).setLevel(2).setLevelName("B1").setIsEfficient(1).setIsShow(1); TreeDemo treeDemo7 = new TreeDemo(); treeDemo7.setId(8).setParentId(7).setLevel(3).setLevelName("C1").setIsEfficient(1).setIsShow(1); TreeDemo treeDemo8 = new TreeDemo(); treeDemo8.setId(9).setParentId(8).setLevel(4).setLevelName("D1").setIsEfficient(1).setIsShow(1); TreeDemo treeDemo9 = new TreeDemo(); treeDemo9.setId(10).setParentId(9).setLevel(5).setLevelName("E1").setIsEfficient(1).setIsShow(1); TreeDemo treeDemo10 = new TreeDemo(); treeDemo10.setId(11).setParentId(7).setLevel(3).setLevelName("C2").setIsEfficient(1).setIsShow(1); TreeDemo treeDemo11 = new TreeDemo(); treeDemo11.setId(12).setParentId(8).setLevel(4).setLevelName("D2").setIsEfficient(1).setIsShow(1); TreeDemo treeDemo12 = new TreeDemo(); treeDemo12.setId(13).setParentId(9).setLevel(5).setLevelName("E2").setIsEfficient(1).setIsShow(1); treeDemoList.add(treeDemo); treeDemoList.add(treeDemo1); treeDemoList.add(treeDemo2); treeDemoList.add(treeDemo3); treeDemoList.add(treeDemo4); treeDemoList.add(treeDemo5); treeDemoList.add(treeDemo6); treeDemoList.add(treeDemo7); treeDemoList.add(treeDemo8); treeDemoList.add(treeDemo9); treeDemoList.add(treeDemo10); treeDemoList.add(treeDemo11); treeDemoList.add(treeDemo12); return treeDemoList; } /** * 1.2:將源數據轉化為樹結構數據 */ public static List<Tree<Integer>> transform(List<TreeDemo> treeDemoList){ treeDemoList=initTreeDemo(); // 2.配置 TreeNodeConfig config = new TreeNodeConfig(); //默認為id可以不設置 config.setIdKey("id"); //默認為parentId可以不設置 config.setParentIdKey("parentId"); //最大遞歸深度 config.setDeep(5); //排序字段 config.setWeightKey("level"); // 3.轉樹,Tree<>里面泛型為id的類型 List<Tree<Integer>> build = TreeUtil.build(treeDemoList, 0, config, (object, tree) -> { // 也可以使用 tree.setId(object.getId());等一些默認值 tree.putExtra("id", object.getId()); tree.putExtra("parentId", object.getParentId()); tree.putExtra("level", object.getLevel()); tree.putExtra("levelName", object.getLevelName()); tree.putExtra("isEfficient", object.getIsEfficient()); tree.putExtra("isShow", object.getIsShow()); }); System.out.println("將源數據轉化為樹:"+JSONUtil.toJsonStr(build)); return build; } /** * @desc 2.1 子節點查找父節點(此功能自己實現可以用treeUtil里面的getParentsName) * * 實現思路:1、獲取指定節點 * 2、將全部節點轉化為map,id做key * 3、遞歸循環向上匹配 知道對象為空 */ public static List<TreeDemo> childToParent(List<TreeDemo> treeDemoList, List<Tree<Integer>> build){//定義指定節點 TreeDemo treeDemo9 = new TreeDemo(); treeDemo9.setId(10).setParentId(9).setLevel(5).setLevelName("E1").setIsEfficient(1).setIsShow(1);//通過set添加查找后的實體 final Set<TreeDemo> nodeList = new HashSet<>();//將源數據轉化為map final Map<Integer, TreeDemo> allMap = treeDemoList.stream().collect(Collectors.toMap(TreeDemo::getId, Function.identity(), (v1, v2) -> v2));// build.forEach(node -> { findParent(nodeList, treeDemo9, allMap);// }); List<TreeDemo> nodes = new ArrayList<>(nodeList); System.out.println("子節點找父節點:"+JSONUtil.toJsonStr(nodes)); return nodes; } /** * :2.2遞歸查找父節點 */ private static void findParent(Set<TreeDemo> nodeList, TreeDemo current, Map<Integer, TreeDemo> allMap) { if (Objects.nonNull(current)) { nodeList.add(current); } if (Objects.nonNull(current)) { TreeDemo parent = allMap.get(current.getParentId()); findParent(nodeList, parent, allMap); } } /** * @desc 通過指定3:節點查找子節點 */ public static Tree<Integer> parentToChile( List<Tree<Integer>> build){ Tree<Integer> childNode = new Tree<>(); for(Tree node : build){ childNode=TreeUtil.getNode(node,6); if(Objects.nonNull(childNode)){ break; } } System.out.println("查找父節點及其子節點:"+JSONUtil.toJsonStr(childNode)); return childNode; }
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
如何在ppt中插入滾動的圖片和音樂?是什么樣子滾動的圖片,滾動的音樂是指從幻燈片開始一直播放到幻燈片結束??自動播放的話這在PPT中最普通啦,自定義動畫中直接設置動畫的開始時間,一般給對象添加動畫后默認的是點擊鼠標開始動畫,然后你可以自己改成從上一項開始,也可以自己定義動畫從什么時間開始播放~~ PPT如何使多張圖片在一張幻燈片中循環滾動播放?使PPT中一張幻燈片中的多張圖片循環播放的步驟:1、選...
北京新東方現在地址在哪里?北京新東方地址:王四營鄉道口村董家158號C單元新東方有自己的樓嗎?一些在中關村,耗資3億元的新東方總部大樓。北京新東方南樓地址位于北京市海淀區東三街2號,海淀黃莊西側。地處硅谷核心地帶,北臨中關村西、北四環,南臨海淀南路,東西鄰中關村、蘇州街。新東方南樓為A、B兩棟15層寫字樓,地上15層,地下3層,中間由4層裙樓相連。項目總面積19470平方米,規劃總建筑面積8234...
騰達無線路由器w308rv2怎么設置?設置騰達無線路由器;第一步;打開電腦的瀏覽器,在地址欄輸入192.168.1.1,進入路由器的管理界面。第二步;選擇PPPO騰達路由器怎么橋接小米路由器?布魯特與那臺設備無關。只需打開騰達路由器的無線橋接功能,搜索小米主路由器,輸入密碼,連接即可橋接成功。308是什么意思?308是戀愛分手的意思,分手的數字意思。的數字代表著豐富的含義,比如520,我愛你,52...