随笔 - 40  文章 - 0  评论 - 4  阅读 - 24万

java实现tree树形结构

树节点遍历工具类:
复制代码
 1 @UtilityClass
 2 public class TreeUtil {
 3     /**
 4      * 两层循环实现建树
 5      *
 6      * @param treeNodes 传入的树节点列表
 7      * @return
 8      */
 9     public <T extends TreeNode> List<T> bulid(List<T> treeNodes, Object root) {
10 
11         List<T> trees = new ArrayList<>();
12 
13         for (T treeNode : treeNodes) {
14 
15             if (root.equals(treeNode.getParentId())) {
16                 trees.add(treeNode);
17             }
18 
19             for (T it : treeNodes) {
20                 if (it.getParentId() == treeNode.getId()) {
21                     if (treeNode.getChildren() == null) {
22                         treeNode.setChildren(new ArrayList<>());
23                     }
24                     treeNode.add(it);
25                 }
26             }
27         }
28         return trees;
29     }
30 
31     /**
32      * 使用递归方法建树
33      *
34      * @param treeNodes
35      * @return
36      */
37     public <T extends TreeNode> List<T> buildByRecursive(List<T> treeNodes, Object root) {
38         List<T> trees = new ArrayList<T>();
39         for (T treeNode : treeNodes) {
40             if (root.equals(treeNode.getParentId())) {
41                 trees.add(findChildren(treeNode, treeNodes));
42             }
43         }
44         return trees;
45     }
46 
47     /**
48      * 递归查找子节点
49      *
50      * @param treeNodes
51      * @return
52      */
53     public <T extends TreeNode> T findChildren(T treeNode, List<T> treeNodes) {
54         for (T it : treeNodes) {
55             if (treeNode.getId() == it.getParentId()) {
56                 if (treeNode.getChildren() == null) {
57                     treeNode.setChildren(new ArrayList<>());
58                 }
59                 treeNode.add(findChildren(it, treeNodes));
60             }
61         }
62         return treeNode;
63     }
64 }
TreeUtil
复制代码

   树模型:

复制代码
 1 @Data
 2 public class TreeNode {
 3     protected int id;
 4     protected int parentId;
 5     protected String name;
 6     protected List<TreeNode> children = new ArrayList<TreeNode>();
 7 
 8     public void add(TreeNode node) {
 9         children.add(node);
10     }
11 }
TreeNode
复制代码

 部门树:

 

复制代码
1 @Data
2 @EqualsAndHashCode(callSuper = true)
3 public class DeptTree extends TreeNode {
4     private String name;
5 }
DeptTree
复制代码

   构建部门树方法:

复制代码
 1 public List<DeptTree> getDeptTree(List<SysDept> depts) {
 2         List<DeptTree> treeList = depts.stream()
 3                 .filter(dept -> !dept.getDeptId().equals(dept.getParentId()))
 4                 .map(dept -> {
 5                     DeptTree node = new DeptTree();
 6                     node.setId(dept.getDeptId());
 7                     node.setParentId(dept.getParentId());
 8                     node.setName(dept.getName());
 9                     return node;
10                 }).collect(Collectors.toList());
11         return TreeUtil.bulid(treeList, 0);
12     }
getDeptTree
复制代码

 

 
posted on   悠悠一小生  阅读(47614)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示