java List<Map>转为树形结构

需求

  • 前端需要写一个级联下拉选,希望得到的数据是Json格式的树形结构,而数据库里面能反映树形结构的有一个pid字段,且程序从数据库获取到的数据是一个列表,当前的任务就是将这个列表转化为树形结构

分析

  • 1,通过观察所需的树形结构的数据格式,设计出的返回数据格式如下:
	[
		{
			***:***
			children:[
				{},
				{}
			]
		}
		,{}
   ]
  • 2, 这里可以使用递归来实现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)名称对应好,其他的逻辑基本上不用变

你可能感兴趣的:(java,java,list,树结构)