首页 > 其他分享 >【编码技巧】总结一个稳定而高效的方法,将二维关系数据转换为树形结构

【编码技巧】总结一个稳定而高效的方法,将二维关系数据转换为树形结构

时间:2024-07-30 12:31:18浏览次数:14  
标签:code name 关系数据 二维 树形 allMap import id

        产品或项目开发过程中,经常遇到一些存在上下级关系的树形结构,但在数据库中存储为二维表关系数据的情况。而前端树形控件又要求按照树形层级组织数据,这就存在一个平铺的关系数据转换为树形层级结构的典型问题。

       表结构及二维数据示例(以id,parentid自关联为例):

Create Table TreeData(id varchar(36), code varchar(50), name narchar(100), parentid varchar(36));

[{id: "", code: "", name: "", parentid: ""}]

 

       期望的数据示例:

[{id: "", code: "", name: "", parentid: "", subNodes:[{id: "", code: "", name: "", parentid: "", subNodes:[]}]}]

 

       在实际编码过程,我们可以采用嵌套循环或递归等方式处理,但如果遇到数据量较大、层级较深且层级不固定等场景,此种实现性能不佳。从时间复杂度来说,是O(n2).

       之前在几次性能优化时,采用过一个方法,先构造全量数据的HashMap,然后再快速将自身加到父对象的子节点集合,此方式性能稳定、时间复杂度为O(n),经过实际验证效果也不错(5k节点时间消耗从>700ms优化到<100ms),在此记录备忘。

import lombok.Data;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Data
public class Func {
    private String id;
    private String code;
    private String name;
    private String parentId;
    private List<Func> subNodes;

    public List<Func> BuildTreeData(List<Func> orignList) {
        Map<String, Func> allMap = new HashMap<>();
        List<Func> rootList = new ArrayList<>();
        for (Func func : orignList) {
            allMap.put(func.getId(), func);
        }

        for (Map.Entry<String, Func> map : allMap.entrySet()) {
            if (allMap.containsKey(map.getValue().getParentId())) {
                Func parent = allMap.get(map.getValue().getParentId());
                if (parent.getSubNodes() == null) {
                    parent.setSubNodes(new ArrayList<>());
                }
                parent.getSubNodes().add(map.getValue());
            } else {
                rootList.add(map.getValue());
            }
        }

        return rootList;
    }
}

 

标签:code,name,关系数据,二维,树形,allMap,import,id
From: https://www.cnblogs.com/zhaoguan_wang/p/18332090

相关文章

  • keycloak~为微信二维码添加动态kc认可的动态state
    本实例将通过keycloak社区登录实现微信二维码的登录,并且二微码不是keycloak动态生成,而是通过微信提供的js生成的,在页面上直接输出的方式实现的。动态state在Keycloak中使用微信二维码登录时,state参数确实是由后端生成的,并且用于确保登录过程的安全性,防止CSRF攻击等。如果你尝试......
  • JS 生成二维码
    JS生成二维码:<!DOCTYPEhtml><html><head><metacharset="utf-8"/><metaname="referrer"content="always"/><metahttp-equiv="X-UA-Compatible"content="IE=edge"/>......
  • Lua 语法_复杂类型表____数组与二维数组
    复杂数据类型Lua所有的复杂类型都是table(表)数组如何用Luatable(表)实现数组--lua表中没有具体的限制可以是数值,字符串,布尔值a={1,2,3,4,"洛溪",true,nil}--Lua中默认索引从1开始0如果没有自定义索引则为空nilprint(a[0])--#号时用的获取长度的关键字--......
  • mysql基础查询案例(连接查询、时间日期查询、树形表查询、函数查询、日期统计案例)
    一、连接查询图解示意图1、建表语句部门和员工关系表:CREATETABLE`tb_dept`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'主键ID',`deptName`varchar(30)DEFAULTNULLCOMMENT'部门名称',PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=6DEFAU......
  • C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
    写在最前,一篇文章学会C语言指针顶级重要,学习C语言最重要的一部分-------指针第八章指针超详细讲解_指针变量_二维数组指针_指向字符串指针文章目录写在最前,一篇文章学会C语言指针第八章指针超详细讲解_指针变量_二维数组指针_指向字符串指针1.指针变量1.1指针变......
  • Luogu P3177 树上染色 [ 蓝 ] [ 树形 dp ] [ 贡献思维 ]
    一道很好的树形dp!!!!!树上染色。错误思路定义\(dp[u][i]\)表示以\(u\)为根的子树中,把\(i\)个点染成黑色的最大收益。但这样写,就在转移的时候必须枚举每一个点,复杂度过大,而且还不好写,是十分错误的写法。正确思路一般看到有关树上“路径”的题,就要把路径拆成一个个独立的......
  • flutter 根据网址生成二维码
    依赖qr_flutter:^4.1.0#二维码代码Center(child:Column(children:[Center(child:QrImageView(data:'https://www.baidu.com/',version:QrVersions.auto,......
  • C语言知识大闯关之二维数组与变长数组
    目录引言1.二维数组的创建1.1二维数组的概念1.2二维数组的创建2.二维数组的初始化2.1不完全初始化2.2完全初始化2.3按照行初始化2.4初始化时省略行,但不可以省略列3.数组的使用3.1二维数组的下标3.2二维数组的输入和输出二维数组在内存中的存储4.C99中的变长数组引......
  • C语言---二维数组
    1.1概念        从逻辑上有行有列的数组,成为二维数组,相对来讲,只有行这种单一线性结构的数组称为一维数组。二维数组本质上是以数组作为数组元素的数组,即“数组的数组”。定义由行和列组成的二维表格形式元素,二维数组其实也就是矩阵基本格式。访问二维数组需要两个值......
  • std的map或者set中,比较浮点类型二维三维数据
    在map和set中,如果比较对象是二维或者三维数据,需要把二维三维数据的浮点数转换为比较精度。如果比较精度是0.001,那么数据的精度也必须是0.001,不然会出现如下情况:比较函数 structPoint001Comp{booloperator()(constPoint*l,constPoint*r)const{i......