目录
- Java用递归生成树形结构
- 1、准备实体对象
- 2、准备测试数据
- 3、构造树形结构递归函数
- 4、测试
- 5、输出结果
- 总结
java用递归生成树形结构
1、准备实体对象
public class TreeNode{ private int id; private int pid; private String name; private String content; private List<TreeNode> children; public TreeNode() { } public TreeNode(int id, int pid, String name, String content) { this.id = id; this.pid = pid; this.name = name; this.content = content; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public List<TreeNode> getChildren(){ return children; } public void setChildren(List<TreeNode> children){ this.children = children; } @Override public String toString() { return "TreeNode{" + "id=" + idandroid + ", pid=" + pid + ", name='" + name + '\'' + ", content='" + content + '\'' + '}'; } }
2、准备测试数据
//生成测试数据方法 public static List<TreeNode> generateList(){ List<TreeNode> list = new ArrayList<>(); TreeNode treeModel1 = new TreeNode(1,0,"系统管理",getRandomStr()); TreeNode treeModel2 = new TreeNode(11,1,"用户管理",getRandomStr()); TreeNode treeModel3 = new TreeNode(111,11,"用户添加",getRandomStr()); TreeNode treeModel4 = new TreeNode(2,0,"权限管理",getRandomStr()); TreeNode treeModel5 = new TreeNode(21,2,"账号管理",getRandomStr()); TreeNode treeModel6 = new TreeNode(221,2,"角色管理",getRandomStr()); list.add(treeModel1); list.add(treeModel2); list.add(treeModel3); list.add(treeModel4); list.add(treeModel5); list.add(treeModel6); return list; } //随便写了一个由26个小写字母随机生成字符串方法 public static String getRandomStr(){ StringBuilder ret= new StringBuilder(); for (int i = 0; i < 6; i++) { int num=(int)(Math.random()*26+97); ret.append((char) num); } return ret.toString(); }
3、构造树形结构递归函数
/** * 生成树 * @param list 待处理的数据集合 * @param pid 最顶层的父级id */ public statiaCWeiinqKpc List<TreeNode> createTree(List<TreeNode> list,int pid){ //根据父id过滤出所有父节点 List<TreeNode> tree = list.stream().filter(e-> pid == e.getPid()).collect(Collectors.toList()); //遍历所有父节点,把属于该节点的所有子节点加到该节点的children属性下 for (TreeNode node: tree) { int id = node.getId(); //过滤出所有属于该节点的子节点 List<TreeNode> cList = list.stream().filter(e-> id == e.getPid()).collectwww.devze.com(Collectors.toList()); //判断是否存在子节点,若子节点有数据则把该子节点的id作为pid继续递归往下层处理 if(!SysUtil.isNull(cList)){ createTree(list,id); node.setChildren(cList); } } return tree; }
4、测试
public static void main(String[] args) throws Exception { List<TreeNode> list = generateList(); list.forEach(System.out::println); List<TreeNode> tree = createTree(list,0); System.out.println(jsON.toJSONString(tree)); }
5、输出结果
TreeNode{id=1, pid=0, name='系统管理', content='vyzjpq'}
TreeNode{id=11, pid=1, name='用户管理', content='qwbiex'}TreeNode{id=111, pid=11, name='用户添加', content='zu编程yuth'}TreeNode{id=2, pid=0, name='权限管理', content='ctgevw'}TreeNode{id=21, pid=2, name='账号管理', content='ulgvdx'}TreeNode{id=221, pid=2, name='角色管理', content='fzxufe'}[{"children":[{"children":[{"content":"zuyuth","id":111,"name":"用户添加","pid":11}],"content":"qwbiex","id":11,"name":"用户管理","pid":1}],"content":"vyzjpq","id":1,"name":"系统管理","pid":0},{"children":[{"content":"ulgvdx","id&quandroidot;:21,"name":"账号管理","pid":2},{"content":"fzxufe","id":221,"name":"角色管理","pid":2}],"content":"ctgevw","id":2,"name":"权限管理","pid":0}]
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论