直接看借鉴博客:https://blog.csdn.net/massivestars/article/details/53911620/
第一种:List<Object对象>转成tree树形结构
由于我的业务没有父子级id两个字段,只有一个层级id字段来分层,如一级数据:01,02,03...,二级数据:0101,0102,0103,0201,...,三级数据:010101,010102...等等,但思路是一样的,我用的是两个for循环搞定,如下:
/** * @Description:list转tree(树形方法) * @Author: * @Date:2018/12/16 16:19 **/ public static List<WkgGroupVo> listToTree(List<WkgGroupVo> wkgGroupVoList){ List<WkgGroupVo> wkgGroupVoTree = new ArrayList<WkgGroupVo>(); for(WkgGroupVo wgVo : wkgGroupVoList){ //层级字段数据为两位数,则是一级数据 if(wgVo.getGpStructurecode().length() == 2){ wkgGroupVoTree.add(wgVo); } //循环出子级数据,添加到一级数据 for(WkgGroupVo subWgVo : wkgGroupVoList){ int len = subWgVo.getGpStructurecode().length(); String gpStructurecode = subWgVo.getGpStructurecode().substring(0, len -2); if(gpStructurecode.equals(wgVo.getGpStructurecode())){ if(wgVo.getWgList() == null){ wgVo.setWgList(new ArrayList<WkgGroupVo>()); } wgVo.getWgList().add(subWgVo); } } } return wkgGroupVoTree; }
第二种:List<Map>转成tree树形结构:亲测没什么问题,根据自己的业务来修改细节代码
借鉴博客:https://blog.csdn.net/M_amazing/article/details/120079121
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}]}]
。