开发者

java如何用递归生成树形结构

目录
  • 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)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜