TreeBuild.java 2.8 KB

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