java 遍历树形数据生成List

 

学习了如何生成树形的数据? 反过来,知道树形数据,如何遍历子集,生成List数据呢?

 

要求:

已知当前D环节的id,获取前置环节的id(找出A,B,C环节的id)

 

当前数据是树形的,比如:

[{
	"NEXT_TCH_ID": 1009205,
	"TCH_ID": 1009208,
	"children": [{
		"NEXT_TCH_ID": 1009208,
		"TCH_ID": 1009206,
		"children": [{
			"NEXT_TCH_ID": 1009206,
			"TCH_ID": 1009204,
			"children": []
		}]
	}]
}, {
	"NEXT_TCH_ID": 1009205,
	"TCH_ID": 1009209,
	"children": [{
		"NEXT_TCH_ID": 1009209,
		"TCH_ID": 1009207,
		"children": [{
			"NEXT_TCH_ID": 1009207,
			"TCH_ID": 1009204,
			"children": []
		}]
	}]
}]

 

处理:

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.collections4.ListUtils;
import org.apache.commons.collections4.MapUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class TreeToList {

    public static void main(String[] args){
        List<Map<String,Object>> data = changeFormat(initData());
        List<Map<String, Object>> result = recurTree(data);
        System.out.println("result "+result);
    }

    private static List<Map<String,Object>> changeFormat(String areaInfo){
        JSONArray areaArr = JSONArray.parseArray(areaInfo);
        return ListUtils.emptyIfNull(areaArr).stream().map(e -> (JSONObject) e)
                .map(e -> (Map<String, Object>)JSONObject.parseObject( e.toJSONString())).collect(Collectors.toList());
    }

    private static String initData(){
        String data = "[{\"NEXT_TCH_ID\":1009205,\"TCH_ID\":1009208,\"children\":[{\"NEXT_TCH_ID\":1009208,\"TCH_ID\":1009206,\"children\":[{\"NEXT_TCH_ID\":1009206,\"TCH_ID\":1009204,\"children\":[]}]}]},{\"NEXT_TCH_ID\":1009205,\"TCH_ID\":1009209,\"children\":[{\"NEXT_TCH_ID\":1009209,\"TCH_ID\":1009207,\"children\":[{\"NEXT_TCH_ID\":1009207,\"TCH_ID\":1009204,\"children\":[]}]}]}]";
        System.out.println("data: "+data);
        return data;
    }

    private static List<Map<String,Object>> recurTree(List<Map<String, Object>> result){
        List<Map<String,Object>> all = new ArrayList<>();
        ListUtils.emptyIfNull(result).forEach(e -> {
            // 递归获取子集
            treeToList(e, all);
        });

        return  all;
    }

    private static void treeToList(Map<String, Object> node, List<Map<String,Object>> all){
        Map<String,Object> single = new HashMap<>();
        single.put("PRE_TCH_ID", MapUtils.getString(node, "TCH_ID")); // 重命名
        single.put("CUR_TCH_ID", MapUtils.getString(node, "NEXT_TCH_ID"));
        all.add(single); // 添加数据
        List<Map<String,Object>> children = (List<Map<String, Object>>) node.get("children");
        if(ifChilds(children)){ // 获取字集,再进行遍历
            for (Map<String, Object> child : children) {
                treeToList(child, all);
            }

        }
    }

    //判断是否存在子集
    private static boolean ifChilds(List<?> list) {
        boolean flag = false;
        if (list != null && list.size() != 0) {
            flag = true;
        }
        return flag;
    }

}

 

注意点:

 在处理的时候,声明一个all的List,传递给子集,递归的时候不断进行累加

 

结果:

data: [{"NEXT_TCH_ID":1009205,"TCH_ID":1009208,"children":[{"NEXT_TCH_ID":1009208,"TCH_ID":1009206,"children":[{"NEXT_TCH_ID":1009206,"TCH_ID":1009204,"children":[]}]}]},{"NEXT_TCH_ID":1009205,"TCH_ID":1009209,"children":[{"NEXT_TCH_ID":1009209,"TCH_ID":1009207,"children":[{"NEXT_TCH_ID":1009207,"TCH_ID":1009204,"children":[]}]}]}]

result [{PRE_TCH_ID=1009208, CUR_TCH_ID=1009205}, {PRE_TCH_ID=1009206, CUR_TCH_ID=1009208}, {PRE_TCH_ID=1009204, CUR_TCH_ID=1009206}, {PRE_TCH_ID=1009209, CUR_TCH_ID=1009205}, {PRE_TCH_ID=1009207, CUR_TCH_ID=1009209}, {PRE_TCH_ID=1009204, CUR_TCH_ID=1009207}]

 

总结:

  在遍历树形数据的时候,记得声明一个目标返回的新类型,在遍历的时候,不断往里面加数据就行。 跟生成树形数据有区别。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天狼1222

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值