本文已经过时,新的方法请查看:
https://blog.csdn.net/qq_28726483/article/details/100094611
本工具适合数据量小于1万条的数据。
直接上代码:
tree父类:
@Data
public class Tree{
private Number id;
private Number pid;
private Collection childs;
}
生成树的工厂类
/**
* 树工厂类,用于生成树
* @author xieshuang
* @date 2019-08-08 10:43
*/
public class TreeFactory<T extends Tree>{
public Collection<T> createTree(Collection<T> treeNodes){
Collection<T> treeNodeList = new ArrayList<>();
for (T treeNode : treeNodes) {
if (treeNode.getPid()==null || treeNode.getPid().equals(0) || treeNode.getPid().equals(0L)){
treeNodeList.add(addChildNode(treeNode, treeNodes));
}
}
return treeNodeList;
}
private T addChildNode(T treeNode, Collection<T> treeNodes){
List<T> treeNodeList = new ArrayList<>();
for (T node : treeNodes) {
if (node.getPid()!=null && node.getPid().equals(treeNode.getId())){
treeNodeList.add(addChildNode(node, treeNodes));
}
}
treeNode.setChilds(treeNodeList);
return treeNode;
}
}
实际场景中用到的树对象
@Data
public class MyTree extends Tree {
private String name;
}
测试
public class test{
public static void main(String[] args) {
System.out.println("1111111111111111111111");
List<MyTree> trees = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
MyTree myTree = new MyTree();
myTree.setName("顶级"+i);
myTree.setId(i);
myTree.setPid(0);
trees.add(myTree);
for (int j = 11; j <100 ; j++) {
MyTree myTree1 = new MyTree();
myTree1.setName("子级"+j);
myTree1.setId(j);
myTree1.setPid(i);
trees.add(myTree1);
}
}
System.out.println(trees);
System.out.println("222222222222222222222");
Collection<MyTree> tree = new TreeFactory<MyTree>().createTree(trees);
System.out.println(JSONObject.toJSONString(tree));
System.out.println("3333333333333333333333333");
}
}
说明:
1.我们要生成的树的对象继承Tree对象即可。
2.需要排序的话在调用生成树方法之前对传入的集合进行排序即可。
3.生成树的数据量建议在1万条左右,否则会很慢,超级慢。经测试,1万数据量生成在1S左右,10万已经半天跑不出来了。大数据量请做懒加载,逐级获取数据。