java递归实现树结构
package org.example;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* Hello world!
*/
public class App {
public static void main(String[] args) {
List<FlowNodeOperate> flowNodeOperateVos = new ArrayList<>();
// 查询所有节点
List<FlowNodeOperate> flowNodeOperateList = listByFlowNodeOperate();
for (FlowNodeOperate flowNodeOperate : flowNodeOperateList) {
if (flowNodeOperate.getPid() == 0) {
flowNodeOperateVos.add(flowNodeOperate);
recursion(flowNodeOperateList, flowNodeOperate);
}
}
// 打印json
System.out.println(toJsonString(flowNodeOperateVos));
}
/**
* 对象转json
*
* @param object 对象
* @return json 字符串
*/
public static String toJsonString(Object object) {
ObjectMapper objectMapper = new ObjectMapper();
try {
return objectMapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
/**
* 模拟数据库
*
* @return 城市列表
*/
public static List<FlowNodeOperate> listByFlowNodeOperate() {
List<FlowNodeOperate> operateArrayList = new ArrayList<>();
operateArrayList.add(new FlowNodeOperate(1, "湖南", 0));
operateArrayList.add(new FlowNodeOperate(2, "广东", 0));
operateArrayList.add(new FlowNodeOperate(3, "长沙", 1));
operateArrayList.add(new FlowNodeOperate(4, "衡阳", 1));
operateArrayList.add(new FlowNodeOperate(5, "广州", 2));
operateArrayList.add(new FlowNodeOperate(6, "深圳", 2));
operateArrayList.add(new FlowNodeOperate(7, "常德", 1));
operateArrayList.add(new FlowNodeOperate(8, "耒阳", 4));
operateArrayList.add(new FlowNodeOperate(9, "常平", 8));
operateArrayList.add(new FlowNodeOperate(10, "太平", 8));
operateArrayList.add(new FlowNodeOperate(11, "石见", 8));
operateArrayList.add(new FlowNodeOperate(12, "花都", 5));
operateArrayList.add(new FlowNodeOperate(13, "狮岭", 12));
operateArrayList.add(new FlowNodeOperate(14, "龙岗", 6));
operateArrayList.add(new FlowNodeOperate(15, "怀化", 1));
return operateArrayList;
}
/**
* 递归方法
*
* @param flowNodeOperateList 所有城市的集合
* @param flowNodeOperate 父节点
*/
public static void recursion(List<FlowNodeOperate> flowNodeOperateList, FlowNodeOperate flowNodeOperate) {
List<FlowNodeOperate> nodeOperateVos = new ArrayList<>();
// 判断是否有下一个节点
List<Integer> pIds = flowNodeOperateList.stream().map(FlowNodeOperate::getPid).collect(Collectors.toList());
if (!pIds.contains(flowNodeOperate.getId())) {
flowNodeOperate.setFlowNodeOperates(nodeOperateVos);
}
for (FlowNodeOperate nodeOperate : flowNodeOperateList) {
if (nodeOperate.getPid().equals(flowNodeOperate.getId())) {
nodeOperateVos.add(nodeOperate);
// 递归获取子节点
recursion(flowNodeOperateList, nodeOperate);
}
}
flowNodeOperate.setFlowNodeOperates(nodeOperateVos);
}
}
结果
[
{
"id": 1,
"nodeOperate": "湖南",
"pid": 0,
"flowNodeOperates": [
{
"id": 3,
"nodeOperate": "长沙",
"pid": 1,
"flowNodeOperates": [
]
},
{
"id": 4,
"nodeOperate": "衡阳",
"pid": 1,
"flowNodeOperates": [
{
"id": 8,
"nodeOperate": "耒阳",
"pid": 4,
"flowNodeOperates": [
{
"id": 9,
"nodeOperate": "常平",
"pid": 8,
"flowNodeOperates": [
]
},
{
"id": 10,
"nodeOperate": "太平",
"pid": 8,
"flowNodeOperates": [
]
},
{
"id": 11,
"nodeOperate": "石见",
"pid": 8,
"flowNodeOperates": [
]
}
]
}
]
},
{
"id": 7,
"nodeOperate": "常德",
"pid": 1,
"flowNodeOperates": [
]
},
{
"id": 15,
"nodeOperate": "怀化",
"pid": 1,
"flowNodeOperates": [
]
}
]
},
{
"id": 2,
"nodeOperate": "广东",
"pid": 0,
"flowNodeOperates": [
{
"id": 5,
"nodeOperate": "广州",
"pid": 2,
"flowNodeOperates": [
{
"id": 12,
"nodeOperate": "花都",
"pid": 5,
"flowNodeOperates": [
{
"id": 13,
"nodeOperate": "狮岭",
"pid": 12,
"flowNodeOperates": [
]
}
]
}
]
},
{
"id": 6,
"nodeOperate": "深圳",
"pid": 2,
"flowNodeOperates": [
{
"id": 14,
"nodeOperate": "龙岗",
"pid": 6,
"flowNodeOperates": [
]
}
]
}
]
}
]
java 8 实现方式
package org.example;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* Hello world!
*/
public class App {
public static void main(String[] args) throws IOException {
List<FlowNodeOperate> flowNodeOperateList = listByFlowNodeOperate();
List<FlowNodeOperate> flowNodeOperateVos = flowNodeOperateList.stream().filter((e) -> e.getPid().equals(0)).peek(e -> e.setFlowNodeOperates(recursion(e, flowNodeOperateList))).collect(Collectors.toList());
System.out.println(toJsonString(flowNodeOperateVos));
}
/**
* 对象转json
*
* @param object 对象
* @return json 字符串
*/
public static String toJsonString(Object object) {
ObjectMapper objectMapper = new ObjectMapper();
try {
return objectMapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
/**
* 模拟数据库
*
* @return 城市列表
*/
public static List<FlowNodeOperate> listByFlowNodeOperate() {
List<FlowNodeOperate> operateArrayList = new ArrayList<>();
operateArrayList.add(new FlowNodeOperate(1, "湖南", 0));
operateArrayList.add(new FlowNodeOperate(2, "广东", 0));
operateArrayList.add(new FlowNodeOperate(3, "长沙", 1));
operateArrayList.add(new FlowNodeOperate(4, "衡阳", 1));
operateArrayList.add(new FlowNodeOperate(5, "广州", 2));
operateArrayList.add(new FlowNodeOperate(6, "深圳", 2));
operateArrayList.add(new FlowNodeOperate(7, "常德", 1));
operateArrayList.add(new FlowNodeOperate(8, "耒阳", 4));
operateArrayList.add(new FlowNodeOperate(9, "常平", 8));
operateArrayList.add(new FlowNodeOperate(10, "太平", 8));
operateArrayList.add(new FlowNodeOperate(11, "石见", 8));
operateArrayList.add(new FlowNodeOperate(12, "花都", 5));
operateArrayList.add(new FlowNodeOperate(13, "狮岭", 12));
operateArrayList.add(new FlowNodeOperate(14, "龙岗", 6));
operateArrayList.add(new FlowNodeOperate(15, "怀化", 1));
return operateArrayList;
}
/**
* 递归方法
*
* @param flowNodeOperateList 所有城市的集合
* @param flowNodeOperate 父节点
*/
public static List<FlowNodeOperate> recursion(FlowNodeOperate flowNodeOperate, List<FlowNodeOperate> flowNodeOperateList) {
return flowNodeOperateList.stream().filter(e -> flowNodeOperate.getId().equals(e.getPid())).peek(e -> e.setFlowNodeOperates(recursion(e, flowNodeOperateList))).collect(Collectors.toList());
}
}