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}]
总结:
在遍历树形数据的时候,记得声明一个目标返回的新类型,在遍历的时候,不断往里面加数据就行。 跟生成树形数据有区别。
上一篇:
IDEA上Java项目控制台中文乱码