java递归处理树形结构数据

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

在实战开发中经常有需要处理树形菜单、树形目录等等等业务需求。而对于这种产品,在设计数据库时也建议使用id<----->parentId的结构来做。但是最终前端显示多用hightChart或者Echart插件来实现。所以在给前端数据时,最好的做法就是把数据库结构话的数据处理成treeJson格式。本文就简单介绍以递归方式处理此数据。

数据库表结构

idnametypeparentId
1root10
2a11
3b11
4c11
5d12
6e12
7f13
8g17

最终想要的效果

image.png

java 递归实现代码

package com.br.usercenter;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.collections.map.HashedMap;

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

/**
 * @author jack cooper
 * @create 2017-09-15 16:53
 */
public class TreeRecursion {

    public static void main(String[] args) {

        Map<String,Node> nodes = new HashedMap();
        //模拟数据库存储树结构
        nodes.put("1",new Node("1","root",1,"0"));
        nodes.put("2",new Node("2","a",1,"1"));
        nodes.put("3",new Node("3","b",1,"1"));
        nodes.put("4",new Node("4","c",1,"1"));
        nodes.put("5",new Node("5","d",1,"2"));
        nodes.put("6",new Node("6","e",1,"2"));
        nodes.put("7",new Node("7","f",1,"3"));
        nodes.put("8",new Node("8","g",1,"7"));
        System.out.println("result:" + JSON.toJSONString(getNodeJson("0",nodes)));
    }

    /**
     * 递归处理   数据库树结构数据->树形json
     * @param nodeId
     * @param nodes
     * @return
     */
    public static JSONArray getNodeJson(String nodeId, Map<String,Node> nodes){

        //当前层级当前node对象
        Node cur = nodes.get(nodeId);
        //当前层级当前点下的所有子节点(实战中不要慢慢去查,一次加载到集合然后慢慢处理)
        List<Node> childList = getChildNodes(nodeId,nodes);

        JSONArray childTree = new JSONArray();
        for (Node node : childList) {
            JSONObject o = new JSONObject();
            o.put("name", node.getName());
            o.put("type", node.getType());
            JSONArray childs = getNodeJson(node.getId(),nodes);  //递归调用该方法
            if(!childs.isEmpty()) {
                o.put("children",childs);
            }
            childTree.fluentAdd(o);
        }
        return childTree;
    }

    /**
     * 获取当前节点的所有子节点
     * @param nodeId
     * @param nodes
     * @return
     */
    public static List<Node> getChildNodes(String nodeId, Map<String,Node> nodes){
        List<Node> list = new ArrayList<>();
        for (String key : nodes.keySet() ) {
            if(nodes.get(key).getParentId().equals(nodeId)){
                list.add(nodes.get(key));
            }
        }
        return list;
    }

}


class Node{
    public String id ;
    public String name;
    public Integer type;
    public String parentId;

    public Node(String id, String name, Integer type, String parentId) {
        this.id = id;
        this.name = name;
        this.type = type;
        this.parentId = parentId;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getType() {
        return type;
    }

    public void setType(Integer type) {
        this.type = type;
    }

    public String getParentId() {
        return parentId;
    }

    public void setParentId(String parentId) {
        this.parentId = parentId;
    }
}

最终结果json

[
    {
        "children": [
            {
                "children": [
                    {
                        "children": [
                            {
                                "name": "g",
                                "type": 1
                            }
                        ],
                        "name": "f",
                        "type": 1
                    }
                ],
                "name": "b",
                "type": 1
            },
            {
                "children": [
                    {
                        "name": "d",
                        "type": 1
                    },
                    {
                        "name": "e",
                        "type": 1
                    }
                ],
                "name": "a",
                "type": 1
            },
            {
                "name": "c",
                "type": 1
            }
        ],
        "name": "root",
        "type": 1
    }
]

用echart处理最终效果

访问http://echarts.baidu.com/echarts2/doc/example/tree1.html
在左侧json中找到data节点,将value替换成上述json。点击刷新即可。



作者:jackcooper
链接:https://www.jianshu.com/p/7da6c1182d69
来源:简书

数据结构之树的知识点梳理和分析 树的概念 我们先来介绍一下树的基本组成结构,树由一个个带有数据和指针的节点组成,指针使得不同节点之间获得了联系,所有的节点都源自于终端节点(根节点),它可以指向若干子节点,子节点又会指向更多子节点,最终指向终端节点(叶节点),终端节点没有子节点。一个节点是它指向的子节点的直接前驱,子节点是它的直接后继。 一、接下来我们介绍一下节点之间的关系: 1、双亲节点(双亲节点是一个节点):一个节点是它的子... 阅读详情

相关推荐

数据库记录转树形结构Java实现

层次结构数据是一种特殊的数据组织形式,它模仿了自然界和社会组织中的等级制度,如家庭族谱、组织架构图、文件目录等。在这种数据结构中,每个数据节点都有一个或多个“子节点”和一个“父节点”,形成了一种树形或倒立的树形结构。在树形结构中,顶层的节点称为根节点,根节点之下是各级子节点,子节点也可能有自己的子节点,以此类推。层次结构数据的特性包括:单根性:整个结构存在且只存在一个根节点。层次性:节点之间存在清晰的层级关系,数据从上层流向下层。唯一性。

weixin_33660045的博客 1097

java递归实现树形结构数据

java递归实现树形结构数据

陈小翔的博客 1万+

华三模拟器实战:IPSec VPN穿越NAT的完整配置与调试(附常见问题排查)

本文详细解析了华三模拟器中IPSec VPN穿越NAT的完整配置与调试方法,包括基础环境准备、分步配置、ACL协调策略及高级故障排查。通过实战案例和关键参数解析,帮助网络工程师解决IPSec与NAT协同工作的典型问题,提升企业网络安全性。

weixin_33724046的博客 435

java 递归处理树形结构数据

在实战开发中经常有需要处理树形菜单、树形目录等等等业务需求。而对于这种产品,在设计数据库时也建议使用id<----->parentId的结构来做。但是最终前端显示多用hightChart或者Echart插件来实现。所以在给前端数据时,最好的做法就是把数据库结构话的数据处理成treeJson格式。...

weixin_34370347的博客 3902

前端数据处理必备技能:数据树形结构化(递归法与递归法)

在前端的开发过程中,我们有时候会碰到这么种情况,后端给我们的是一组平铺的数据。 而我们需要渲染的却是一个树形结构图,那么我们要怎么将其进行转化呢? [ {id:"01", pid:"", "name":"老王" }, {id:"02", pid:"01", "name":"小张" }, {id:"03", pid:"01", "name":"老王" }, {id:"04", pid:"", "name":"老李" }, {id:"05", pid:"04", "

weixin_58384302的博客 7136

Java递归实现树形结构的两种方式

Java递归实现树形结构的两种常见方式。

一宿君 1万+

java递归树形表修改,java 递归处理树形结构数据

在实战开发中经常有需要处理树形菜单、树形目录等等等业务需求。而对于这种产品,在设计数据库时也建议使用idparentId的结构来做。但是最终前端显示多用hightChart或者Echart插件来实现。所以在给前端数据时,最好的做法就是把数据库结构话的数据处理成treeJson格式。本文就简单介绍以递归方式处理数据数据库表结构idnametypeparentId1root102a113b114c...

weixin_31041955的博客 1209

java使用递归思想处理树形结构类型数据

*java使用递归思想处理树形结构类型数据 * 数据表对应的实体类 public class Category { private Long id; private Long parentId; private String name; public Category(Long id, Long parentId, String name) { this.id = id; this.parentId = parentId; t

yaokailiubo的博客 349

TreeUitls工具类Java树形结构数据处理(递归处理)

1、项目需求: 从数据库从加载所有的菜单出来,菜单中有 id,parentId,name字段 希望能有一个工具帮我进行树形结构重组; 实例类: package com.ruoyi; public class TreeNode { /** * 节点id */ private String id; /** * 父节点 默认0为根节点 */ private String parentId; ...

qq_42298793的博客 510

Java树形结构数据处理(递归处理)-可自由更换业务实体-TreeUitls工具类详解

需求: 数据结构 id : 主键id name : 显示名称 parentId : 父id 参考并借鉴 左轩大佬的这篇文章 https://blog.csdn.net/shinylp/article/details/78620592 (附上原链接,本文代码在基础上讲如何整合到自己的业务里面) 如何能添加到自己的业务里面,先看他原代码 import lombok.Data; im...

coder小龙 2285

树状数据处理来源java_基于递归算法,树形结构数据下业务场景,封装解决方法...

本文源码:GitHub·点这里 || GitEE·点这里一、递归算法1、概念简介递归算法的核心思想是通过将问题重复分解为同类的或其子问题的方式,从而可以使用统一的解决方式。很多编程语言支持方法或函数自我调用,简单的说,就是在函数或方法体内,自身可以再次调用自身的方法结构。2、基础案例这里通过递归的方式,计算阶乘、求和等相关逻辑。public class Demo01 {public static...

weixin_29369017的博客 106

java组装树状结构数据集合_java 递归处理树形结构数据-阿里云开发者社区

在实战开发中经常有需要处理树形菜单、树形目录等等等业务需求。而对于这种产品,在设计数据库时也建议使用idparentId的结构来做。但是最终前端显示多用hightChart或者Echart插件来实现。所以在给前端数据时,最好的做法就是把数据库结构话的数据处理成treeJson格式。本文就简单介绍以递归方式处理数据数据库表结构idnametypeparentId1root102a113b114c...

weixin_39584529的博客 280

Java树形结构数据处理(递归处理)-随业务更换实体-TreeUitls工具类详解

使用java获取权限树状菜单、 工具类及工具类使用

GoldenStar的博客 3244

Java后端组装树形结构数据

项目开发中,几乎无法避免的会遇到树形结构,今天和大家分享java后端如何处理数据树形结构。 1.封装测试实体类 package com.ldl.cn.demo; import java.util.ArrayList; import java.util.List; public class Dept { private int id; private int...

SeeYouAgain的博客 1万+

java后端:数据树形结构返回

树形结构返回: { "msg": "操作成功", "code": 200, "data": [ { "id": 1, "name": "AA", "describe": "DFDSF", "parentId": 0, "level": 1, "ancestors": "0", "type"..

迷路人的博客 3344

Java树形结构递归(以时间换空间)和非递归(以空间换时间)

Java树形结构递归(以时间换空间)和非递归(以空间换时间) 使用场景:如果层级比较多和数据量比较大建议用非递归方式效率更高; 树形结构如下图 测试类代码: package com.zxq.tree_dom; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import java.util.*; public class Test { public static void main

qq_35222843的博客 878

java—stream流递归实现树形结构

stream流递归实现树形结构

shang_0122的博客 5607

java8新特性-stream实现递归树形结构

项目需求中会有需求是查询出来菜单树形结构,那么可以使用java8新特性去实现。 模拟表中数据 实体类 @ApiModel(value = "树结构信息") @Data @AllArgsConstructor public class TreeEntity { @ApiModelProperty("唯一id") private Integer id; @ApiModelProperty("名称") private String name; @ApiMode

qq_42956376的博客 3578

java 递归获取树形结构数据(不需要多次查询数据库)

java递归获取树形结构数据(不需要多次查询数据库)

qq_39554240的博客 1142
上一篇: WebService超简单入门教程(转发-侵删)
hakulamatataaa
博客等级 码龄10年 0粉丝 3原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值