1、利用场景
组织机构树,通常会有组织机构表,其中有code(代码),pcode(上级代码),name(组织名称)等字段
2、构造数据(以下数据并不是组织机构数据,而纯属本人胡编乱造的数据)
1 List<Tree<Test>> trees = new ArrayList<Tree<Test>>(); 2 tests.add(new Test("0", "", "关于本人")); 3 tests.add(new Test("1", "0", "技术学习")); 4 tests.add(new Test("2", "0", "兴趣")); 5 tests.add(new Test("3", "1", "JAVA")); 6 tests.add(new Test("4", "1", "oracle")); 7 tests.add(new Test("5", "1", "spring")); 8 tests.add(new Test("6", "1", "springmvc")); 9 tests.add(new Test("7", "1", "fastdfs")); 10 tests.add(new Test("8", "1", "linux")); 11 tests.add(new Test("9", "2", "骑行")); 12 tests.add(new Test("10", "2", "吃喝玩乐")); 13 tests.add(new Test("11", "2", "学习")); 14 tests.add(new Test("12", "3", "String")); 15 tests.add(new Test("13", "4", "sql")); 16 tests.add(new Test("14", "5", "ioc")); 17 tests.add(new Test("15", "5", "aop")); 18 tests.add(new Test("16", "1", "等等")); 19 tests.add(new Test("17", "2", "等等")); 20 tests.add(new Test("18", "3", "等等")); 21 tests.add(new Test("19", "4", "等等")); 22 tests.add(new Test("20", "5", "等等"));
3、源码
Tree.java
1 package pers.kangxu.datautils.bean.tree; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.Map; 6 7 import com.alibaba.fastjson.JSON; 8 9 /** 10 * tree TODO <br> 11 * 12 * @author kangxu2 2017-1-7 13 * 14 */ 15 public class Tree<T> { 16 /** 17 * 节点ID 18 */ 19 private String id; 20 /** 21 * 显示节点文本 22 */ 23 private String text; 24 /** 25 * 节点状态,open closed 26 */ 27 private String state = "open"; 28 /** 29 * 节点是否被选中 true false 30 */ 31 private boolean checked = false; 32 /** 33 * 节点属性 34 */ 35 private List<Map<String, Object>> attributes; 36 /** 37 * 节点的子节点 38 */ 39 private List<Tree<T>> children = new ArrayList<Tree<T>>(); 40 41 /** 42 * 父ID 43 */ 44 private String parentId; 45 /** 46 * 是否有父节点 47 */ 48 private boolean isParent = false; 49 /** 50 * 是否有子节点 51 */ 52 private boolean isChildren = false; 53 54 public String getId() { 55 return id; 56 } 57 58 public void setId(String id) { 59 this.id = id; 60 } 61 62 public String getText() { 63 return text; 64 } 65 66 public void setText(String text) { 67 this.text = text; 68 } 69 70 public String getState() { 71 return state; 72 } 73 74 public void setState(String state) { 75 this.state = state; 76 } 77 78 public boolean isChecked() { 79 return checked; 80 } 81 82 public void setChecked(boolean checked) { 83 this.checked = checked; 84 } 85 86 public List<Map<String, Object>> getAttributes() { 87 return attributes; 88 } 89 90 public void setAttributes(List<Map<String, Object>> attributes) { 91 this.attributes = attributes; 92 } 93 94 public List<Tree<T>> getChildren() { 95 return children; 96 } 97 98 public void setChildren(List<Tree<T>> children) { 99 this.children = children; 100 } 101 102 public boolean isParent() { 103 return isParent; 104 } 105 106 public void setParent(boolean isParent) { 107 this.isParent = isParent; 108 } 109 110 public boolean isChildren() { 111 return isChildren; 112 } 113 114 public void setChildren(boolean isChildren) { 115 this.isChildren = isChildren; 116 } 117 118 public String getParentId() { 119 return parentId; 120 } 121 122 public void setParentId(String parentId) { 123 this.parentId = parentId; 124 } 125 126 public Tree(String id, String text, String state, boolean checked, 127 List<Map<String, Object>> attributes, List<Tree<T>> children, 128 boolean isParent, boolean isChildren, String parentID) { 129 super(); 130 this.id = id; 131 this.text = text; 132 this.state = state; 133 this.checked = checked; 134 this.attributes = attributes; 135 this.children = children; 136 this.isParent = isParent; 137 this.isChildren = isChildren; 138 this.parentId = parentID; 139 } 140 141 public Tree() { 142 super(); 143 } 144 145 @Override 146 public String toString() { 147 148 return JSON.toJSONString(this); 149 } 150 151 }
BuildTree.java
1 package pers.kangxu.datautils.common.tree; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import pers.kangxu.datautils.bean.tree.Tree; 7 8 /** 9 * 构建tree 10 * TODO 11 * <br> 12 * @author kangxu2 2017-1-7 13 * 14 */ 15 public class BuildTree { 16 17 /** 18 * 19 * TODO 20 * <br> 21 * @author kangxu2 2017-1-7 22 * 23 * @param nodes 24 * @return 25 */ 26 public static <T> Tree<T> build(List<Tree<T>> nodes) { 27 28 if(nodes == null){ 29 return null; 30 } 31 List<Tree<T>> topNodes = new ArrayList<Tree<T>>(); 32 33 for (Tree<T> children : nodes) { 34 35 String pid = children.getParentId(); 36 if (pid == null || "".equals(pid)) { 37 topNodes.add(children); 38 39 continue; 40 } 41 42 for (Tree<T> parent : nodes) { 43 String id = parent.getId(); 44 if (id != null && id.equals(pid)) { 45 parent.getChildren().add(children); 46 children.setParent(true); 47 parent.setChildren(true); 48 49 continue; 50 } 51 } 52 53 } 54 55 Tree<T> root = new Tree<T>(); 56 if (topNodes.size() == 0) { 57 root = topNodes.get(0); 58 } else { 59 root.setId("-1"); 60 root.setParentId(""); 61 root.setParent(false); 62 root.setChildren(true); 63 root.setChecked(true); 64 root.setChildren(topNodes); 65 root.setText("顶级节点"); 66 67 } 68 69 return root; 70 } 71 72 }
BuildTreeTester.java
1 package pers.kangxu.datautils.test; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import pers.kangxu.datautils.bean.tree.Tree; 7 import pers.kangxu.datautils.common.tree.BuildTree; 8 9 public class BuildTreeTester { 10 11 public static void main(String[] args) { 12 13 14 List<Tree<Test>> trees = new ArrayList<Tree<Test>>(); 15 List<Test> tests = new ArrayList<Test>(); 16 tests.add(new Test("0", "", "关于本人")); 17 tests.add(new Test("1", "0", "技术学习")); 18 tests.add(new Test("2", "0", "兴趣")); 19 tests.add(new Test("3", "1", "JAVA")); 20 tests.add(new Test("4", "1", "oracle")); 21 tests.add(new Test("5", "1", "spring")); 22 tests.add(new Test("6", "1", "springmvc")); 23 tests.add(new Test("7", "1", "fastdfs")); 24 tests.add(new Test("8", "1", "linux")); 25 tests.add(new Test("9", "2", "骑行")); 26 tests.add(new Test("10", "2", "吃喝玩乐")); 27 tests.add(new Test("11", "2", "学习")); 28 tests.add(new Test("12", "3", "String")); 29 tests.add(new Test("13", "4", "sql")); 30 tests.add(new Test("14", "5", "ioc")); 31 tests.add(new Test("15", "5", "aop")); 32 tests.add(new Test("16", "1", "等等")); 33 tests.add(new Test("17", "2", "等等")); 34 tests.add(new Test("18", "3", "等等")); 35 tests.add(new Test("19", "4", "等等")); 36 tests.add(new Test("20", "5", "等等")); 37 38 for (Test test : tests) { 39 Tree<Test> tree = new Tree<Test>(); 40 tree.setId(test.getId()); 41 tree.setParentId(test.getPid()); 42 tree.setText(test.getText()); 43 44 trees.add(tree); 45 } 46 47 Tree<Test> t = BuildTree.build(trees); 48 System.out.println(t); 49 } 50 } 51 52 class Test { 53 54 private String id; 55 private String pid; 56 private String text; 57 58 public String getId() { 59 return id; 60 } 61 62 public void setId(String id) { 63 this.id = id; 64 } 65 66 public String getPid() { 67 return pid; 68 } 69 70 public void setPid(String pid) { 71 this.pid = pid; 72 } 73 74 public String getText() { 75 return text; 76 } 77 78 public void setText(String text) { 79 this.text = text; 80 } 81 82 public Test(String id, String pid, String text) { 83 super(); 84 this.id = id; 85 this.pid = pid; 86 this.text = text; 87 } 88 89 public Test() { 90 super(); 91 } 92 93 @Override 94 public String toString() { 95 return "Test [id=" + id + ", pid=" + pid + ", text=" + text + "]"; 96 } 97 98 }
4、运行结果
JSON数据:
{
"checked": true,
"children": [
{
"checked": false,
"children": [
{
"checked": false,
"children": [
{
"checked": false,
"children": [
{
"checked": false,
"children": [],
"id": "12",
"parent": true,
"parentId": "3",
"state": "open",
"text": "String"
},
{
"checked": false,
"children": [],
"id": "18",
"parent": true,
"parentId": "3",
"state": "open",
"text": "等等"
}
],
"id": "3",
"parent": true,
"parentId": "1",
"state": "open",
"text": "JAVA"
},
{
"checked": false,
"children": [
{
"checked": false,
"children": [],
"id": "13",
"parent": true,
"parentId": "4",
"state": "open",
"text": "sql"
},
{
"checked": false,
"children": [],
"id": "19",
"parent": true,
"parentId": "4",
"state": "open",
"text": "等等"
}
],
"id": "4",
"parent": true,
"parentId": "1",
"state": "open",
"text": "oracle"
},
{
"checked": false,
"children": [
{
"checked": false,
"children": [],
"id": "14",
"parent": true,
"parentId": "5",
"state": "open",
"text": "ioc"
},
{
"checked": false,
"children": [],
"id": "15",
"parent": true,
"parentId": "5",
"state": "open",
"text": "aop"
},
{
"checked": false,
"children": [],
"id": "20",
"parent": true,
"parentId": "5",
"state": "open",
"text": "等等"
}
],
"id": "5",
"parent": true,
"parentId": "1",
"state": "open",
"text": "spring"
},
{
"checked": false,
"children": [],
"id": "6",
"parent": true,
"parentId": "1",
"state": "open",
"text": "springmvc"
},
{
"checked": false,
"children": [],
"id": "7",
"parent": true,
"parentId": "1",
"state": "open",
"text": "fastdfs"
},
{
"checked": false,
"children": [],
"id": "8",
"parent": true,
"parentId": "1",
"state": "open",
"text": "linux"
},
{
"checked": false,
"children": [],
"id": "16",
"parent": true,
"parentId": "1",
"state": "open",
"text": "等等"
}
],
"id": "1",
"parent": true,
"parentId": "0",
"state": "open",
"text": "技术学习"
},
{
"checked": false,
"children": [
{
"checked": false,
"children": [],
"id": "9",
"parent": true,
"parentId": "2",
"state": "open",
"text": "骑行"
},
{
"checked": false,
"children": [],
"id": "10",
"parent": true,
"parentId": "2",
"state": "open",
"text": "吃喝玩乐"
},
{
"checked": false,
"children": [],
"id": "11",
"parent": true,
"parentId": "2",
"state": "open",
"text": "学习"
},
{
"checked": false,
"children": [],
"id": "17",
"parent": true,
"parentId": "2",
"state": "open",
"text": "等等"
}
],
"id": "2",
"parent": true,
"parentId": "0",
"state": "open",
"text": "兴趣"
}
],
"id": "0",
"parent": false,
"parentId": "",
"state": "open",
"text": "关于本人"
}
],
"id": "-1",
"parent": false,
"parentId": "",
"state": "open",
"text": "顶级节点"
}
原文:http://www.cnblogs.com/kangxu/p/6260755.html