javaList<Map>转为树形结构
需求
前端需要写⼀个级联下拉选,希望得到的数据是Json格式的树形结构,⽽数据库⾥⾯能反映树形结构的有⼀个pid字段,且程序从数据库获取到的数据是⼀个列表,当前的任务就是将这个列表转化为树形结构
分析
1,通过观察所需的树形结构的数据格式,设计出的返回数据格式如下:
[
{
***:***
children:[
{},
{}
]
}
,{}
]
2, 这⾥可以使⽤递归来实现children的获取,具体分析写在代码⾥了
代码
import*;
/**
* 2021/9/2 16:39
* describe:
mua什么意思*
* @author mazheng
*/
public class OuterDemo {
public static void main(String[] args){
fancy什么意思// 下⾯是测试的数据,⼤概的结构是
// 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("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);
chicken的复数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){
("pid")=="0"){
level1List.add(map);
}
}
// 最终返回前台的数据 List
List<Map<String, Object>> finaList =new ArrayList<>();
冬天里的一把火 英文// ⼀个临时数据tmpMap,⽤来做临时交换数据
Map<String, Object> tmpMap;
// 遍历第⼀层,给他塞数据,赛Children的时候进⾏递归in your eyes歌词
for(Map<String, Object> map : level1List){
//这⾥要⽣成⼀个新的HashMap
少儿英语费用tmpMap =new HashMap<>();
tmpMap.put("id", ("id"));
tmpMap.put("pid", ("pid"));
tmpMap.put("label", ("label"));
// 这⾥的 ifHasChild 是为了加快程序运⾏,如果没孩⼦就别递归了,直接下⼀个兄弟节点
if(ifHasChild((String) ("id"), list)){
// 最主要的⼀步,递归,找到孩⼦节点,然后塞到Map中
tmpMap.put("Children",getChildren(tmpMap, list));
rockwell}
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){
("pid").("id"))){
tmMap =new HashMap<>();
tmMap.put("id", ("id"));
tmMap.put("pid", ("pid"));
tmMap.put("label", ("label"));
// 递归代码
if(ifHasChild((String) ("id"), list)){
tmMap.put("Children",getChildren(tmMap, list));
tmMap.put("Children",getChildren(tmMap, list));
contractor}
mapList.add(tmMap);
}
}
// 递归返回条件,如果没返回条件就死循环了
if(mapList.size()==0){
//没有⼦节点情况下
return null;
}el{
return mapList;
}
}
// 判断⼀个Map是否有⼦节点,加快程序运⾏
public static boolean ifHasChild(String id, List<Map<String, Object>> list){
int result =0;
for(Map<String, Object> map : list){
("pid")!=null&& ("pid").equals(id)){
result++;
}
}
return result >0?true:fal;
xianyan}
}
结果
[{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)名称对应好,其他的逻辑基本上不⽤变