(原创)父子关系数据递归加工成tree形数据(减轻数据库压力)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(原创)父子关系数据递归加工成tree形数据(减轻数据库压力)相关的知识,希望对你有一定的参考价值。

package test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * IdPIdDatasToTree<BR>
 * <P>Author : td </P>  
 * <P>Date : 2016年9月30日下午4:54:59</P>
 * <P>Desc : 将上下级数据加工成为tree形数据结构</P>
 * @param response
 * @param request
 */
public class IdPIdDatasToTree {

    public static void main(String[] args) {
        List < Map < String, Object >> list = new ArrayList < Map < String, Object >> ();
        Map < String, Object > m = null;
        for (int i = 1; i < 10; i++) {
            m = new HashMap < String, Object > ();
            m.put("id", i + "");
            m.put("name", "我是节点" + i);
            m.put("parentId", i - 1 + "");
            list.add(m);
        }
        List < Map < String, Object >> treeMenuList = new LinkedList < Map < String, Object >> ();
        treeMenuList = treeMenuList(list, treeMenuList, "0");
        System.out.println("要加工的数据为:" + list.toString());
        System.out.println("加工好的tree状结构为:" + treeMenuList.toString());
    }

    /**
     * 
     * @param menuList 原始数据
     * @param treeMenuList tree数据对象
     * @param parentId  数据的父id
     * @return
     */
    @SuppressWarnings("unchecked")
    public static List < Map < String, Object >> treeMenuList(List < Map < String, Object >> list, List < Map < String, Object >> treeMenuList, String parentId) {

        //没有根节点情况下
        if ("0".equals(parentId)) {
            treeMenuList = getChildNodeList("0", list);
            for (Map < String, Object > treeMenu: treeMenuList) {
                String id = (String) treeMenu.get("id");
                treeMenu.put("childNode", getChildNodeList(id, list));
                treeMenuList(list, treeMenuList, id);
            }
        } else {
            for (Map < String, Object > treeMenu: treeMenuList) {
                //判断是否有子元素,有的话递归子元素 继续判断
                String id = (String) treeMenu.get("id");
                if (treeMenu.containsKey("childNode")) {
                    //获取子元素
                    List < Map < String, Object >> childNodeList = (List < Map < String, Object >> ) treeMenu.get("childNode");
                    if (childNodeList != null && childNodeList.size() > 0) {
                        for (Map < String, Object > tMenu: childNodeList) {
                            treeMenuList(list, childNodeList, tMenu.get("id").toString());
                        }
                    }
                    //如果没有子元素,根据id查询儿子 将儿子赋值
                } else {
                    List < Map < String, Object >> chList = getChildNodeList(id, list);
                    if (null != chList) {
                        treeMenu.put("childNode", chList);
                        treeMenuList(list, chList, id);
                    }
                }
            }
        }
        return treeMenuList;
    }

    /**
     * 
     * @param parentId 数据父id
     * @param list  原始数据
     * @return
     */
    public static List < Map < String, Object >> getChildNodeList(String parentId, List < Map < String, Object >> list) {
        List < Map < String, Object >> childNodeList = new LinkedList < Map < String, Object >> ();
        for (Map < String, Object > childNode: list) {
            //从新new 对象 (如果不重新new对象,list 的值会随之变动,不知道咋回事?)
            Map < String, Object > m = new HashMap < String, Object > ();
            m.putAll(childNode);
            String pId = (String) childNode.get("parentId");
            if (pId.equals(parentId)) {
                childNodeList.add(m);
            }
        }
        if (childNodeList.size() == 0) return null;
        return childNodeList;
    }
}

  

以上是关于(原创)父子关系数据递归加工成tree形数据(减轻数据库压力)的主要内容,如果未能解决你的问题,请参考以下文章

oracle和postgresql 递归查询父子关系记录语法区别

js将有父子关系的数据转换成树形结构数据

list构建数据库父子关系

无序binarytree二叉树堆调整成小顶堆,基于节点图,非数组内操作,非递归,python

Tree树 递归查询,显示成JSON格式

js生成tree形组织机构下拉框