将List转成树的两种方式(递归、循环)

在做目录树的时候通常是将一个目录存在数据库的List全部返回来,再根据节点id和parentId组装成一颗树。这里切忌使用递归查询数据库的方式实现,应把对应的目录数据全部查询回来再进行组装。List转成Tree有两种方式,一种是常用的递归,一种是双层循环。


TreeNode.java

  1. package org.massive.tree;
  2. import java.util.List;
  3. /**
  4. * Created by Massive on 2016/12/26.
  5. */
  6. public class TreeNode {
  7. private String id;
  8. private String parentId;
  9. private String name;
  10. private List<TreeNode> children;
  11. public TreeNode(String id, String name, String parentId) {
  12. this.id = id;
  13. this.parentId = parentId;
  14. this.name = name;
  15. }
  16. public TreeNode(String id, String name, TreeNode parent) {
  17. this.id = id;
  18. this.parentId = parent.getId();
  19. this.name = name;
  20. }
  21. public String getParentId() {
  22. return parentId;
  23. }
  24. public void setParentId(String parentId) {
  25. this.parentId = parentId;
  26. }
  27. public String getName() {
  28. return name;
  29. }
  30. public void setName(String name) {
  31. this.name = name;
  32. }
  33. public String getId() {
  34. return id;
  35. }
  36. public void setId(String id) {
  37. this.id = id;
  38. }
  39. public List<TreeNode> getChildren() {
  40. return children;
  41. }
  42. public void setChildren(List<TreeNode> children) {
  43. this.children = children;
  44. }
  45. @Override
  46. public String toString() {
  47. return "TreeNode{" +
  48. "id='" + id + '\'' +
  49. ", parentId='" + parentId + '\'' +
  50. ", name='" + name + '\'' +
  51. ", children=" + children +
  52. '}';
  53. }
  54. }


TreeBuilder.java

  1. package org.massive.tree;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. /**
  5. * Created by Massive on 2016/12/26.
  6. */
  7. public class TreeBuilder {
  8. /**
  9. * 两层循环实现建树
  10. * @param treeNodes 传入的树节点列表
  11. * @return
  12. */
  13. public static List<TreeNode> bulid(List<TreeNode> treeNodes) {
  14. List<TreeNode> trees = new ArrayList<TreeNode>();
  15. for (TreeNode treeNode : treeNodes) {
  16. if ( "0".equals(treeNode.getParentId())) {
  17. trees.add(treeNode);
  18. }
  19. for (TreeNode it : treeNodes) {
  20. if (it.getParentId() == treeNode.getId()) {
  21. if (treeNode.getChildren() == null) {
  22. treeNode.setChildren( new ArrayList<TreeNode>());
  23. }
  24. treeNode.getChildren().add(it);
  25. }
  26. }
  27. }
  28. return trees;
  29. }
  30. /**
  31. * 使用递归方法建树
  32. * @param treeNodes
  33. * @return
  34. */
  35. public static List<TreeNode> buildByRecursive(List<TreeNode> treeNodes) {
  36. List<TreeNode> trees = new ArrayList<TreeNode>();
  37. for (TreeNode treeNode : treeNodes) {
  38. if ( "0".equals(treeNode.getParentId())) {
  39. trees.add(findChildren(treeNode,treeNodes));
  40. }
  41. }
  42. return trees;
  43. }
  44. /**
  45. * 递归查找子节点
  46. * @param treeNodes
  47. * @return
  48. */
  49. public static TreeNode findChildren(TreeNode treeNode,List<TreeNode> treeNodes) {
  50. for (TreeNode it : treeNodes) {
  51. if(treeNode.getId().equals(it.getParentId())) {
  52. if (treeNode.getChildren() == null) {
  53. treeNode.setChildren( new ArrayList<TreeNode>());
  54. }
  55. treeNode.getChildren().add(findChildren(it,treeNodes));
  56. }
  57. }
  58. return treeNode;
  59. }
  60. public static void main(String[] args) {
  61. TreeNode treeNode1 = new TreeNode( "1", "广州", "0");
  62. TreeNode treeNode2 = new TreeNode( "2", "深圳", "0");
  63. TreeNode treeNode3 = new TreeNode( "3", "天河区",treeNode1);
  64. TreeNode treeNode4 = new TreeNode( "4", "越秀区",treeNode1);
  65. TreeNode treeNode5 = new TreeNode( "5", "黄埔区",treeNode1);
  66. TreeNode treeNode6 = new TreeNode( "6", "石牌",treeNode3);
  67. TreeNode treeNode7 = new TreeNode( "7", "百脑汇",treeNode6);
  68. TreeNode treeNode8 = new TreeNode( "8", "南山区",treeNode2);
  69. TreeNode treeNode9 = new TreeNode( "9", "宝安区",treeNode2);
  70. TreeNode treeNode10 = new TreeNode( "10", "科技园",treeNode8);
  71. List<TreeNode> list = new ArrayList<TreeNode>();
  72. list.add(treeNode1);
  73. list.add(treeNode2);
  74. list.add(treeNode3);
  75. list.add(treeNode4);
  76. list.add(treeNode5);
  77. list.add(treeNode6);
  78. list.add(treeNode7);
  79. list.add(treeNode8);
  80. list.add(treeNode9);
  81. list.add(treeNode10);
  82. List<TreeNode> trees = TreeBuilder.bulid(list);
  83. List<TreeNode> trees_ = TreeBuilder.buildByRecursive(list);
  84. }
  85. }
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值