系统开发: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;
    }
}

 

posted @ 2020-08-04 17:22  JiangnanVL  阅读(498)  评论(0)    收藏  举报