java利用递归将list转换为树

22 篇文章 0 订阅
10 篇文章 0 订阅

在前后端分离实际开发过程中,遇到过这样问题就是前端element框架在Tree树形控件的构建需要后端向前端传递的也是树型的json。

以下是官网要求格式:

在这里插入图片描述

要求的json格式如下:
[{
	"id": "1",
	"pId": "0",
	"name": "1级节点",
	"children": [{
		"id": "2",
		"pId": "1",
		"name": "2级节点",
		"children": [{
			"id": "3",
			"pId": "2",
			"name": "3级节点"
		}]
	}]
}]

但是在数据存储时,这些树型结构数据都会存储为一条条的包含父id的数据。一般情况下后台只会将数据以无结构形式传递至前端,这就导致前端需要重新解析后端传递的数据。

一般后端返回的json格式如下:
[{
	"id": "1",
	"pId": "0",
	"name": "1级节点"
},{
	"id": "2",
	"pId": "1",
	"name": "2级节点"
},{
	"id": "3",
	"pId": "2",
	"name": "3级节点"
}]

为了解决这个问题,本人(后台开发)想用后台代码解决这样的问题,解决思路是:

原数据在后台进行递归处理而得到前端所要求的json格式数据。
import com.alibaba.fastjson.*;
import java.util.*;

public static void main(String[] args){
    List<Ztree> ztrees = new ArrayList<>();
    for(int i = 0;i < 3;i++){
        Ztree ztree = new Ztree();
        ztree.setName(i+1+"级节点");
        ztree.setpId(Long.valueOf(i));
        ztree.setId(Long.valueOf(i+1));
        ztrees.add(ztree);
    }
    //原数据
    System.out.println(JSON.toJSONString(ztrees));
    //最终结果树
    System.out.println(JSON.toJSONString(buildByRecursive(ztrees)));
}

/**
 * 使用递归方法建树
 *
 * @param ztrees 原数据
 * @return 最终结果树
 */
public static List<Ztree> buildByRecursive(List<Ztree> ztrees) {
	//最终结果
    List<Ztree> trees = new ArrayList<Ztree>();
    //寻找根节点
    for (Ztree ztree : ztrees) {
        if (ztree.getpId() == null||ztree.getpId() == 0) {
            trees.add(findChildren(ztree,ztrees));
        }
    }
    return trees;
}

/**
 * 递归查找子节点
 *
 * @param ztree 节点
 * @param ztrees 原数据
 * @return
 */
 public static Ztree findChildren(Ztree ztree,List<Ztree> ztrees) {
     for (Ztree ztr : ztrees) {
         if(ztree.getId().equals(ztr.getpId())) {
             if (ztree.getChildren() == null) {
                 ztree.setChildren(new ArrayList<Ztree>());
             }
             ztree.getChildren().add(findChildren(ztr,ztrees));
         }
     }
     return ztree;
 }

Ztree.class

import java.util.*;

public class Ztree
{
    /** 节点ID */
    private Long id;

    /** 节点父ID */
    private Long pId;

    /** 节点名称 */
    private String name;
    
    /** 子对象 */
    private List<Ztree> children;
    
	public Long getId()
    {
        return id;
    }

    public void setId(Long id)
    {
        this.id = id;
    }

    public Long getpId()
    {
        return pId;
    }

    public void setpId(Long pId)
    {
        this.pId = pId;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }
    
    public List<Ztree> getChildren() {
        return children;
    }

    public void setChildren(List<Ztree> children) {
        this.children = children;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值