当前位置:   article > 正文

java构建树形结构_java树形结构

java树形结构

目录

前言

 实现树形结构

一.树节点数据类(反回参数类)

二.给树形结构添加数据

三.测试类

四.测试结果


前言

在我们实际开发中会接触到树形结构,根节点子节点, 然后添加数据构成了我们的树形结构, 在Java后台利用递归思路进行构建树形结构数据,返回给前端,能以下拉菜单等形式进行展示, 以某市行政区为例

图:

 实现树形结构

一.树节点数据类(反回参数类)

  1. @Data
  2. public class TreeNode {
  3. /** 节点ID */
  4. private Integer id;
  5. /** 父节点ID:顶级节点为0 */
  6. private Integer parentId;
  7. /** 节点名称 */
  8. private String label;
  9. /** 子节点 */
  10. private List<TreeNode> children;
  11. public TreeNode(Integer id, Integer parentId, String label) {
  12. this.id = id;
  13. this.parentId = parentId;
  14. this.label = label;
  15. }
  16. }

二.给树形结构添加数据

2.1常用递归方法

思路:

1、首先获取所有的根节点(顶级节点),即根节点的parentId = 0。
2、根据每一个根节点,与所有节点集合(数据)进行判断,当前节点是否为其下的子节点。
3、若是,则递归调用构建树形;若不是,则表明该节点不属于其下子节点。
4、应继续循环判断节点父子关系,直到所有节点与根节点判断完毕。

  1. public class TreeBuild {
  2. // 保存参与构建树形的所有数据(通常数据库查询结果)
  3. public List<TreeNode> nodeList = new ArrayList<>();
  4. /**
  5. * 构造方法
  6. * @param nodeList 将数据集合赋值给nodeList,即所有数据作为所有节点。
  7. */
  8. public TreeBuild(List<TreeNode> nodeList){
  9. this.nodeList = nodeList;
  10. }
  11. /**
  12. * 获取需构建的所有根节点(顶级节点) "0"
  13. * @return 所有根节点List集合
  14. */
  15. public List<TreeNode> getRootNode(){
  16. // 保存所有根节点(所有根节点的数据)
  17. List<TreeNode> rootNodeList = new ArrayList<>();
  18. // treeNode:查询出的每一条数据(节点)
  19. for (TreeNode treeNode : nodeList){
  20. // 判断当前节点是否为根节点,此处注意:若parentId类型是String,则要采用equals()方法判断。
  21. if (0 == treeNode.getParentId()) {
  22. // 是,添加
  23. rootNodeList.add(treeNode);
  24. }
  25. }
  26. return rootNodeList;
  27. }
  28. /**
  29. * 根据每一个顶级节点(根节点)进行构建树形结构
  30. * @return 构建整棵树
  31. */
  32. public List<TreeNode> buildTree(){
  33. // treeNodes:保存一个顶级节点所构建出来的完整树形
  34. List<TreeNode> treeNodes = new ArrayList<TreeNode>();
  35. // getRootNode():获取所有的根节点
  36. for (TreeNode treeRootNode : getRootNode()) {
  37. // 将顶级节点进行构建子树
  38. treeRootNode = buildChildTree(treeRootNode);
  39. // 完成一个顶级节点所构建的树形,增加进来
  40. treeNodes.add(treeRootNode);
  41. }
  42. return treeNodes;
  43. }
  44. /**
  45. * 递归-----构建子树形结构
  46. * @param pNode 根节点(顶级节点)
  47. * @return 整棵树
  48. */
  49. public TreeNode buildChildTree(TreeNode pNode){
  50. List<TreeNode> childTree = new ArrayList<TreeNode>();
  51. // nodeList:所有节点集合(所有数据)
  52. for (TreeNode treeNode : nodeList) {
  53. // 判断当前节点的父节点ID是否等于根节点的ID,即当前节点为其下的子节点
  54. if (treeNode.getParentId().equals(pNode.getId())) {
  55. // 再递归进行判断当前节点的情况,调用自身方法
  56. childTree.add(buildChildTree(treeNode));
  57. }
  58. }
  59. // for循环结束,即节点下没有任何节点,树形构建结束,设置树结果
  60. pNode.setChildren(childTree);
  61. return pNode;
  62. }
  63. }

 2.2.stream方法获取树形结构

  1. public List<TreeNode> getTree(){
  2. // 模拟测试数据(通常为数据库的查询结果)
  3. List<TreeNode> treeNodeList = new ArrayList<>();
  4. treeNodeList.add(new TreeNode(1, 0, "顶级节点A"));
  5. treeNodeList.add(new TreeNode(2, 0, "顶级节点B"));
  6. treeNodeList.add(new TreeNode(3, 1, "父节点是A"));
  7. treeNodeList.add(new TreeNode(4, 2, "父节点是B"));
  8. treeNodeList.add(new TreeNode(5, 2, "父节点是B"));
  9. treeNodeList.add(new TreeNode(6, 3, "父节点的ID是3"));
  10. //过滤顶级id
  11. List<TreeNode> collect = treeNodeList.stream().filter(item -> item.getParentId() != 0).collect(Collectors.toList());
  12. //通过父级id进行分组 获取我们的"List<TreeNode> children"子节点
  13. Map<Integer, List<TreeNode>> map = treeNodeList.stream().collect(Collectors.groupingBy(TreeNode::getParentId));
  14. getChildrenTree(collect,map)
  15. return collect;
  16. }
  17. public static void getChildrenTree(List<TreeNode> collect, Map<Integer, List<TreeNode>> map) {
  18. for (TreeNode treeNode : collect) {
  19. List<TreeNode> childList = map.get(treeNode.getId());
  20. treeNode.setChildren(childList);
  21. }

三.测试类

注意: 返回值有可能请求不出来, 需要循环, 这里我们的返回参数不太一样

  1. @Test
  2. List<TreeNode> contextLoads() {
  3. // 模拟测试数据(通常为数据库的查询结果)
  4. List<TreeNode> treeNodeList = new ArrayList<>();
  5. treeNodeList.add(new TreeNode(1, 0, "顶级节点A"));
  6. treeNodeList.add(new TreeNode(2, 0, "顶级节点B"));
  7. treeNodeList.add(new TreeNode(3, 1, "父节点是A"));
  8. treeNodeList.add(new TreeNode(4, 2, "父节点是B"));
  9. treeNodeList.add(new TreeNode(5, 2, "父节点是B"));
  10. treeNodeList.add(new TreeNode(6, 3, "父节点的ID是3"));
  11. // 创建树形结构(数据集合作为参数)
  12. TreeBuild treeBuild = new TreeBuild(treeNodeList);
  13. // 原查询结果转换树形结构
  14. treeNodeList = treeBuild.buildTree();
  15. return treeNodeList;
  16. }

四.测试结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/596099
推荐阅读
相关标签
  

闽ICP备14008679号