[
{
***:***
children:[
{},
{}
]
}
,{}
]
import java.util.*;
/**
* 2021/9/2 16:39
* describe:
*
* @author mazheng
*/
public class OuterDemo {
public static void main(String[] args) {
// 下面是测试的数据,大概的结构是
// label01->label03->label04
// ->label06
// label02->label->05
Map<String, Object> map1 = new HashMap<>();
map1.put("label", "lala01");
map1.put("pid", "0");
map1.put("id", "1");
Map<String, Object> map2 = new HashMap<>();
map2.put("label", "lala02");
map2.put("pid", "0");
map2.put("id", "2");
Map<String, Object> map3 = new HashMap<>();
map3.put("label", "lala03");
map3.put("pid", "1");
map3.put("id", "3");
Map<String, Object> map4 = new HashMap<>();
map4.put("label", "lala04");
map4.put("pid", "3");
map4.put("id", "4");
Map<String, Object> map5 = new HashMap<>();
map5.put("label", "lala05");
map5.put("pid", "2");
map5.put("id", "5");
Map<String, Object> map6 = new HashMap<>();
map6.put("label", "lala06");
map6.put("pid", "1");
map6.put("id", "6");
// 将测试数据放到List中,模拟数据库返回值
List<Map<String, Object>> list = new LinkedList<>();
list.add(map1);
list.add(map2);
list.add(map3);
list.add(map4);
list.add(map5);
list.add(map6);
System.out.println(list);
// 开始写递归的方法
// 第一层的的数据,在这里就是 label01 和 label02单独抽取出来,因为有时候需要单独处理,也可以将for循环的代码放到递归的位置一起处理
List<Map<String, Object>> level1List = new ArrayList<>();
for (Map<String, Object> map : list) {
if (map.get("pid") == "0") {
level1List.add(map);
}
}
// 最终返回前台的数据 List
List<Map<String, Object>> finaList = new ArrayList<>();
// 一个临时数据tmpMap,用来做临时交换数据
Map<String, Object> tmpMap;
// 遍历第一层,给他塞数据,赛Children的时候进行递归
for (Map<String, Object> map : level1List) {
//这里要生成一个新的HashMap
tmpMap = new HashMap<>();
tmpMap.put("id", map.get("id"));
tmpMap.put("pid", map.get("pid"));
tmpMap.put("label", map.get("label"));
// 这里的 ifHasChild 是为了加快程序运行,如果没孩子就别递归了,直接下一个兄弟节点
if (ifHasChild((String) map.get("id"), list)) {
// 最主要的一步,递归,找到孩子节点,然后塞到Map中
tmpMap.put("Children", getChildren(tmpMap, list));
}
finaList.add(tmpMap);
}
// 打印一下
System.out.println("最终的结果:------------------");
System.out.println(finaList);
}
// 递归程序
public static List<Map<String, Object>> getChildren(Map<String, Object> map, List<Map<String, Object>> list) {
List<Map<String, Object>> mapList = new ArrayList<>();
Map<String, Object> tmMap;
for (Map<String, Object> tmpMap : list) {
if (tmpMap.get("pid").equals(map.get("id"))) {
tmMap = new HashMap<>();
tmMap.put("id", tmpMap.get("id"));
tmMap.put("pid", tmpMap.get("pid"));
tmMap.put("label", tmpMap.get("label"));
// 递归代码
if (ifHasChild((String) tmpMap.get("id"), list)) {
tmMap.put("Children", getChildren(tmMap, list));
}
mapList.add(tmMap);
}
}
// 递归返回条件,如果没返回条件就死循环了
if (mapList.size() == 0) {
//没有子节点情况下
return null;
} else {
return mapList;
}
}
// 判断一个Map是否有子节点,加快程序运行
public static boolean ifHasChild(String id, List<Map<String, Object>> list) {
int result = 0;
for (Map<String, Object> map : list) {
if (map.get("pid") != null && map.get("pid").equals(id)) {
result++;
}
}
return result > 0 ? true : false;
}
}
[{pid=0, id=1, label=lala01, Children=[
{pid=1, id=3, label=lala03, Children=[
{pid=3, id=4, label=lala04}
]},
{pid=1, id=6, label=lala06}]},
{pid=0, id=2, label=lala02, Children=[
{pid=2, id=5, label=lala05}]}]
finalList结果如上,正是我想要的结果,问题解决,这个基本上可以作为一个通用的list生成json格式的代码,只要在数据库取出数据的时候使用as 别名将(id,pid,label)名称对应好,其他的逻辑基本上不用变