学习了如何生成树形的数据? 反过来,知道树形数据,如何遍历子集,生成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}]
总结:
在遍历树形数据的时候,记得声明一个目标返回的新类型,在遍历的时候,不断往里面加数据就行。 跟生成树形数据有区别。