系统开发:List与Tree的相互转换
简介
在实际系统开发中,遇到树形数据解析问题,需要把数据库中查询出来的List转换为TreeNode对象类型,然后方便前端的解析。在实际书写过程中遇到过各种问题,但最后还好通过调试顺利完成并封装成工具类供下次使用,以下为实现Util,仅供参考,有问题可以随时通过邮箱保持联系。
实现
在具体的代码实现过程中,主要提供两种思路解决这个问题,递归是首选,但是我个人更推荐双重循环,毕竟在内存优化和代码可读性方面有着更好的优势。
1、循环
大致原理是通过循环列表,找到该节点下所有的子节点并设置。最后返回Node节点。代码如下:
package com.primeton.common.utils.tree; import com.primeton.project.uump.domain.TreeNode; import java.util.ArrayList; import java.util.List; /** * @Author: jiangzhuang * @Email: jiangzhuang@primeton.com * @Date: 2020/5/20 * @Desc: Build Tree By Double Looping */ public class TreeUtil { /** * 构造树形数据(将Node List型转换为树) * * @param treeList 树节点List * @param rootId 树根节点Id,在该项目中根节点ID都为0 * @return 树型节点数据 */ public static TreeNode buildTree(List<TreeNode> treeList, String rootId){ TreeNode root = null; for(TreeNode tv:treeList){ if(rootId.equals(tv.getId())){ root = tv; } for(TreeNode tn:treeList){ if(tn.getParentId().equals(tv.getId())){ if(tv.getChildren()==null){ List<TreeNode> childList = new ArrayList<>(); childList.add(tn); tv.setChildren(childList); } else{ tv.getChildren().add(tn); } } } } return root; } }
2、递归
package com.primeton.common.utils.tree; import com.primeton.project.uump.domain.TreeNode; import java.util.ArrayList; import java.util.List; /** * @Author: jiangzhuang * @Email: jiangzhuang@primeton.com * @Date: 2020/8/4 * @Desc: Build Tree By Recursion */ public class TreeRecursionUtil { /** * 构造树形数据(将Node List型转换为树) * * @param treeList 树节点List * @param rootId 树根节点Id,在该项目中根节点ID都为0 * @return 树型节点数据 */ public static TreeNode buildTree(List<TreeNode> treeList, String rootId){ for(TreeNode tn:treeList){ if(rootId.equals(tn.getId())){ return findChildren(treeList, tn); } } return null; } /** * 构造树形数据(递归方法) * * @param treeList TreeNode Lists * @param tv Present TreeNode * @return Constructed TreeNode(Contains the current node and its children node) */ private static TreeNode findChildren(List<TreeNode> treeList, TreeNode tv){ for(TreeNode tn:treeList){ if(tv.getId().equals(tn.getParentId())){ if(tv.getChildren()==null){ tv.setChildren(new ArrayList<>()); } tv.getChildren().add(findChildren(treeList,tn)); } } return tv; } }

浙公网安备 33010602011771号