(原创)父子关系数据递归加工成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;
    }
}

  

时间: 2024-11-10 01:36:04

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

SQL SERVER 2000 遍历父子关系数据的表(二叉树)获得所有子节点 所有父节点及节点层数函数

---SQL SERVER 2000 遍历父子关系數據表(二叉树)获得所有子节点 所有父节点及节点层数函数---Geovin Du 涂聚文--建立測試環境Create Table GeovinDu([ID] Int, fatherID Int, [Name] Varchar(10))Insert A Select 1, 0, '中国'Union All Select 2, 1, '广东'Union All Select 3, 1, '北京'Union All Select 4, 2, '深圳特区

猫猫学iOS 之控制器view显示中view的父子关系及controller的父子关系_解决屏幕旋转不能传递事件问题

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 一:效果 二:项目代码 这个Demo用的几个控制器分别画了不通的xib,随便拖拽了几个空间,主要是几个按钮的切换,主要代码展示下: // // NYViewController.m // 控制器的view的显示 // // Created by apple on 14-10-10. // Copyright (c) 2014年 heima. All rights

oracle处理节点之间的父子关系

通常当与树的结构之间的关系处理,这是一个很复杂的事情,我们可以通过程序代码去逐层遍历父或子节点,这样做的缺点是很明显,效率不高,操作复杂性是比较大的.而当我们使用Oracle当数据库,我们可以有一个简单的解决方法,例如下列: 1.首先创建一张表.保存父子关系 drop table tmp_node; create table tmp_node(id varchar2(500),p_id varchar2(500)); 2.向表中插入数据 insert into tmp_node(p_id,id)

oracle 父子关系

语句递归查找父子关系语句 表结构及数据 1.通过根节点遍历子节点 select t.*,LEVEL from Test2 t START WITH t.parentid=0 CONNECT BY PRIOR t.id = t.parentid 2.通过子节点向根节点追溯 select t.*,LEVEL from Test2 t START WITH t.id='13' CONNECT BY PRIOR t.parentid = t.id 3.查找直接子节点(下一层) select t.*,LE

QObject提供了QMetaObject元类信息(相当于RTTI和反射),信号与连接,父子关系,调试信息,属性,事件,继承关系,窗口类型,线程属性,时间器,对象名称,国际化

元类信息(相当于RTTI和反射),信号与连接,父子关系,调试信息,属性,事件,继承关系,窗口类型,线程属性,时间器,对象名称,国际化其中元类又提供了:classInfo,className,构造函数,多重祖先元类,method, property, Enumerator, Signal, Slot等等 http://doc.qt.io/qt-5/qobject.html http://doc.qt.io/qt-5/qmetaobject.html 我感觉Qt的出现,除了提供GUI以外,主要就是提

Logstash 父子关系 配置

最近在使用Lostash的过程中遇到了一个问题:在一个log文件里包含两类数据,而且两类数据之间存在父子关系,那如何使用lostash的configuration实现这个需求呢 思路: 首先定义父事件的pattern,因为子事件不匹配父pattern,所以logstash会自动为子事件添加_grokparesefailure 标签.通过该标签即可知道当前事件是父事件还是子事件 使用filter->ruby生成document_id,并把它放到ruby全局变量中 ,这样子事件就可以访问到父事件的d

第16课 Qt对象间的父子关系

1. Qt对象间的关系 (1)Qt对象间可以存在父子关系 ①每一个对象都保存有它所有子对象的指针 ②每一个对象都有一个指向其父对象的指针 (2)当指定Qt对象的父对象时 ①其父对象会在子对象链表中加入该对象的指针 ②该对象会保存指向其父对象的指针 (3)当Qt对象被销毁时 ①将自己从父对象的Children List移除 ②将自己的Children List中的所有对象销毁 ▲使用Qt开发时,不仅要时刻注意内存泄露的问题,还要时刻关注对象是否可能被多次销毁的问题. [编程实验]对象间的父子关系

NHibernate之旅(9):探索父子关系(一对多关系)

本节内容 引入 NHibernate中的集合类型 建立父子关系 父子关联映射 结语 引入 通过前几篇文章的介绍,基本上了解了NHibernate,但是在NHibernate中映射关系是NHibernate中的亮点,也是最难掌握的技术.从这篇开始学习这些东西,我将图文结合来说明这里奥秘的知识. 前几篇,我们的例子只使用了一个简单的Customer对象.但是在客户/订单/产品的经典组合中,他们的关系非常复杂?让我们先回顾在第二篇中建立的数据模型. 在图上,我已经清晰的标注了表之间的关系,首先分析Cu

控制器的父子关系建立原则

概念: 如果2个控制器的view是父子关系(不管是直接还是间接的父子关系) 那么这2个控制器也应该为父子关系 例如: [a.view addSubview:b.view]; [a addChildViewController:b]; 或者 [a.view addSubview:otherView]; [otherView addSubview:b.view]; [a addChildViewController:b]; //添加一个子控制器 //self 成为了 OnewViewControll