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}]

总结:

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

经验分享 程序员 微信小程序 职场和发展