在做目录树的时候通常是将一个目录存在数据库的List全部返回来,再根据节点id和parentId组装成一颗树。这里切忌使用递归查询数据库的方式实现,应把对应的目录数据全部查询回来再进行组装。List转成Tree有两种方式,一种是常用的递归,一种是双层循环。
TreeNode.java
- package org.massive.tree;
- import java.util.List;
- /**
- * Created by Massive on 2016/12/26.
- */
- public class TreeNode {
- private String id;
- private String parentId;
- private String name;
- private List<TreeNode> children;
- public TreeNode(String id, String name, String parentId) {
- this.id = id;
- this.parentId = parentId;
- this.name = name;
- }
- public TreeNode(String id, String name, TreeNode parent) {
- this.id = id;
- this.parentId = parent.getId();
- this.name = name;
- }
- public String getParentId() {
- return parentId;
- }
- public void setParentId(String parentId) {
- this.parentId = parentId;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public List<TreeNode> getChildren() {
- return children;
- }
- public void setChildren(List<TreeNode> children) {
- this.children = children;
- }
- @Override
- public String toString() {
- return “TreeNode{“ +
- ”id=’” + id + ’\” +
- ”, parentId=’” + parentId + ’\” +
- ”, name=’” + name + ’\” +
- ”, children=” + children +
- ’}’;
- }
- }
package org.massive.tree;
import java.util.List;
/**
* Created by Massive on 2016/12/26.
*/
public class TreeNode {
private String id;
private String parentId;
private String name;
private List<TreeNode> children;
public TreeNode(String id, String name, String parentId) {
this.id = id;
this.parentId = parentId;
this.name = name;
}
public TreeNode(String id, String name, TreeNode parent) {
this.id = id;
this.parentId = parent.getId();
this.name = name;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public List<TreeNode> getChildren() {
return children;
}
public void setChildren(List<TreeNode> children) {
this.children = children;
}
@Override
public String toString() {
return "TreeNode{" +
"id='" + id + '\'' +
", parentId='" + parentId + '\'' +
", name='" + name + '\'' +
", children=" + children +
'}';
}
}
TreeBuilder.java
- package org.massive.tree;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * Created by Massive on 2016/12/26.
- */
- public class TreeBuilder {
- /**
- * 两层循环实现建树
- * @param treeNodes 传入的树节点列表
- * @return
- */
- public static List<TreeNode> bulid(List<TreeNode> treeNodes) {
- List<TreeNode> trees = new ArrayList<TreeNode>();
- for (TreeNode treeNode : treeNodes) {
- if (“0”.equals(treeNode.getParentId())) {
- trees.add(treeNode);
- }
- for (TreeNode it : treeNodes) {
- if (it.getParentId() == treeNode.getId()) {
- if (treeNode.getChildren() == null) {
- treeNode.setChildren(new ArrayList<TreeNode>());
- }
- treeNode.getChildren().add(it);
- }
- }
- }
- return trees;
- }
- /**
- * 使用递归方法建树
- * @param treeNodes
- * @return
- */
- public static List<TreeNode> buildByRecursive(List<TreeNode> treeNodes) {
- List<TreeNode> trees = new ArrayList<TreeNode>();
- for (TreeNode treeNode : treeNodes) {
- if (“0”.equals(treeNode.getParentId())) {
- trees.add(findChildren(treeNode,treeNodes));
- }
- }
- return trees;
- }
- /**
- * 递归查找子节点
- * @param treeNodes
- * @return
- */
- public static TreeNode findChildren(TreeNode treeNode,List<TreeNode> treeNodes) {
- for (TreeNode it : treeNodes) {
- if(treeNode.getId().equals(it.getParentId())) {
- if (treeNode.getChildren() == null) {
- treeNode.setChildren(new ArrayList<TreeNode>());
- }
- treeNode.getChildren().add(findChildren(it,treeNodes));
- }
- }
- return treeNode;
- }
- public static void main(String[] args) {
- TreeNode treeNode1 = new TreeNode(“1”,“广州”,“0”);
- TreeNode treeNode2 = new TreeNode(“2”,“深圳”,“0”);
- TreeNode treeNode3 = new TreeNode(“3”,“天河区”,treeNode1);
- TreeNode treeNode4 = new TreeNode(“4”,“越秀区”,treeNode1);
- TreeNode treeNode5 = new TreeNode(“5”,“黄埔区”,treeNode1);
- TreeNode treeNode6 = new TreeNode(“6”,“石牌”,treeNode3);
- TreeNode treeNode7 = new TreeNode(“7”,“百脑汇”,treeNode6);
- TreeNode treeNode8 = new TreeNode(“8”,“南山区”,treeNode2);
- TreeNode treeNode9 = new TreeNode(“9”,“宝安区”,treeNode2);
- TreeNode treeNode10 = new TreeNode(“10”,“科技园”,treeNode8);
- List<TreeNode> list = new ArrayList<TreeNode>();
- list.add(treeNode1);
- list.add(treeNode2);
- list.add(treeNode3);
- list.add(treeNode4);
- list.add(treeNode5);
- list.add(treeNode6);
- list.add(treeNode7);
- list.add(treeNode8);
- list.add(treeNode9);
- list.add(treeNode10);
- List<TreeNode> trees = TreeBuilder.bulid(list);
- List<TreeNode> trees_ = TreeBuilder.buildByRecursive(list);
- }
- }
package org.massive.tree;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Massive on 2016/12/26.
*/
public class TreeBuilder {
/**
* 两层循环实现建树
* @param treeNodes 传入的树节点列表
* @return
*/
public static List<TreeNode> bulid(List<TreeNode> treeNodes) {
List<TreeNode> trees = new ArrayList<TreeNode>();
for (TreeNode treeNode : treeNodes) {
if ("0".equals(treeNode.getParentId())) {
trees.add(treeNode);
}
for (TreeNode it : treeNodes) {
if (it.getParentId() == treeNode.getId()) {
if (treeNode.getChildren() == null) {
treeNode.setChildren(new ArrayList<TreeNode>());
}
treeNode.getChildren().add(it);
}
}
}
return trees;
}
/**
* 使用递归方法建树
* @param treeNodes
* @return
*/
public static List<TreeNode> buildByRecursive(List<TreeNode> treeNodes) {
List<TreeNode> trees = new ArrayList<TreeNode>();
for (TreeNode treeNode : treeNodes) {
if ("0".equals(treeNode.getParentId())) {
trees.add(findChildren(treeNode,treeNodes));
}
}
return trees;
}
/**
* 递归查找子节点
* @param treeNodes
* @return
*/
public static TreeNode findChildren(TreeNode treeNode,List<TreeNode> treeNodes) {
for (TreeNode it : treeNodes) {
if(treeNode.getId().equals(it.getParentId())) {
if (treeNode.getChildren() == null) {
treeNode.setChildren(new ArrayList<TreeNode>());
}
treeNode.getChildren().add(findChildren(it,treeNodes));
}
}
return treeNode;
}
public static void main(String[] args) {
TreeNode treeNode1 = new TreeNode("1","广州","0");
TreeNode treeNode2 = new TreeNode("2","深圳","0");
TreeNode treeNode3 = new TreeNode("3","天河区",treeNode1);
TreeNode treeNode4 = new TreeNode("4","越秀区",treeNode1);
TreeNode treeNode5 = new TreeNode("5","黄埔区",treeNode1);
TreeNode treeNode6 = new TreeNode("6","石牌",treeNode3);
TreeNode treeNode7 = new TreeNode("7","百脑汇",treeNode6);
TreeNode treeNode8 = new TreeNode("8","南山区",treeNode2);
TreeNode treeNode9 = new TreeNode("9","宝安区",treeNode2);
TreeNode treeNode10 = new TreeNode("10","科技园",treeNode8);
List<TreeNode> list = new ArrayList<TreeNode>();
list.add(treeNode1);
list.add(treeNode2);
list.add(treeNode3);
list.add(treeNode4);
list.add(treeNode5);
list.add(treeNode6);
list.add(treeNode7);
list.add(treeNode8);
list.add(treeNode9);
list.add(treeNode10);
List<TreeNode> trees = TreeBuilder.bulid(list);
List<TreeNode> trees_ = TreeBuilder.buildByRecursive(list);
}
}
</div>