首页 > 其他分享 >怎么把具有树形父子结构的对象集合存到对应的树形父子结构表里呢

怎么把具有树形父子结构的对象集合存到对应的树形父子结构表里呢

时间:2023-06-29 16:23:25浏览次数:40  
标签:node Map 对象 Node 父子 nodeMap 树形 id 结构

 

可以采用如下步骤:

  1. 创建一个 Map,key 是对象的 id,value 是对象本身。
  2. 遍历对象集合,将对象及其所有子对象都添加到 Map 中。
  3. 迭代 Map 中的对象,检测其父节点是否存在,存在则设置其父 id。
  4. 最后遍历 Map 中的所有对象,按照父 id 顺序插入数据库表中。

具体代码大概如下:

Map<Integer, Node> nodeMap = new HashMap<>();

for (Node node : nodeList) {
    nodeMap.put(node.getId(), node);
    addChildrenToMap(node.getChildren(), nodeMap);    
}

// 设置父 id 
for (Node node : nodeMap.values()) {
    Node parent = nodeMap.get(node.getParentId());
    if (parent != null) {
        node.setParentId(parent.getId());
    } 
}

// 按照父 id 排序后插入数据库
List<Node> insertList = new ArrayList<>(nodeMap.values());  
Collections.sort(insertList, (n1, n2) -> 
    Integer.compare(n1.getParentId(), n2.getParentId()));

for (Node node : insertList) {
    // 插入数据库
}

 

addChildrenToMap() 方法用于递归添加子对象到 Map 中:

 

void addChildrenToMap(List<Node> children, Map<Integer, Node> nodeMap) {
    for (Node child : children) {
        nodeMap.put(child.getId(), child); 
        addChildrenToMap(child.getChildren(), nodeMap);
    }
}

这个代码主要分为以下几个步骤:

  1. 创建一个 Map,用来存储所有对象,key 是对象 id,value 是对象本身。
Map<Integer, Node> nodeMap = new HashMap<>();
  1. 遍历对象集合,将所有对象及其子对象都添加到 Map 中。
for (Node node : nodeList) {
    nodeMap.put(node.getId(), node);
    addChildrenToMap(node.getChildren(), nodeMap);    
}

 

addChildrenToMap() 方法是递归的添加子对象。

 

  1. 设置每个对象的父 id。
for (Node node : nodeMap.values()) {
    Node parent = nodeMap.get(node.getParentId());
    if (parent != null) {
        node.setParentId(parent.getId()); 
    }
}
  1. 根据父 id 排序对象集合。
Collections.sort(insertList, (n1, n2) -> 
    Integer.compare(n1.getParentId(), n2.getParentId()));
  1. 按照排序后的顺序插入数据库。
for (Node node : insertList) {
    // 插入数据库  
}

总的来说,第一步建立对象与 id 的映射;第二步递归添加所有子对象;第三步设置正确的父 id;第四步根据父 id 排序;最后第五步按顺序插入数据库,就能保存正确的树形结构了。

标签:node,Map,对象,Node,父子,nodeMap,树形,id,结构
From: https://www.cnblogs.com/easycoding20211115/p/17507723.html

相关文章

  • 【C语言】时间结构体
    本文主要就C语言中常用类型time_t具体分析。一、定义首先来看一下定义,原来是一种类型重命名。/*File:/usr/include/time.h*/typedef__time_ttime_t;库文件中使用的其实是__time_t这个命名。/*File:/usr/include/bits/time.h*/structtimeval{__time_ttv_se......
  • Java学习——循环结构
    循环结构while循环do...while循环for循环在Java5中引入了一种主要用于数组的增强型for循环breakcontinue一、while循环while(布尔表达式){ //循环内容只要布尔表达式为true,循环就会一直执行下去我们大多数情况是会让循环停止下来的,我们需要一个让表达式失......
  • uva 1407(树形dp)
    题意:有一个机器人从一个节点进入一棵树,给出n个节点之间的距离,如果机器人的能量为x,也就是最多走x,且机器人不需要回到起点,问机器人最多能走多少个节点。题解:f[i][j][0]:遍历子树i的j个节点且最后不需要回到子树的根节点i最少用多少能量f[i][j][1]:遍历子树i的j个节点且最后回......
  • [数据结构]笛卡尔树、ST表、带权并查集
    Cartesiantree(笛卡尔树)1.概念比如拿最小的当根建树,中序遍历是原数组2.性质区间最小值(RMQ),LCA的值,比如上图4和6的LCA是2,表示我们4,6,2这个区间里面的最小值是2找y左边第一个<=y的数就是y往上看第一个向左拐的数3.构造(增量法)对每个前缀考虑我们发现只有右链是......
  • Java 中内置的数据结构
    在计算机领域有八种基本的数据结构,分别为:数组、链表、栈、队列、散列表、树、堆、图,在Java中通过借助这些数据结构的特性封装了一些常用的数据结构类,了解这些数据结构的特性和差异可以帮助我们在编写程序代码的过程中更好的选择合理的数据结构来降低相关算法的空间复杂度和时......
  • mysql workbench 从模型导出表结构
    前言本教程,主要讲述,利用mysqlworkbench从数据库模型导出建表语句mysqlworkbench导出建表语句概述mysql生成数据库模型从数据库模型生成建表语句首先,浏览数据库模型导出建表语句导出一个库的建表语句在EER视图中,File—>Export—->forwarengineersqlcreatescript导出整个模型......
  • 【HarmonyOS】一文教你快速解决低代码连接器返参数据结构嵌套错误问题
    ​【关键字】低代码平台、连接器、返参数据结构嵌套 【写在前面】关于低代码平台中的连接器如何使用,请参考以下内容:https://blog.51cto.com/u_15687416/6414269下文将会介绍连接器在实际使用中遇到的一个常见的问题。 【问题描述】1、云侧接口定义首先来一起看一下云......
  • Lua 中最重要的数据结构:表(Table)
    楔子本次来介绍一下Lua中的表(Table),表是Lua语言中最主要(事实上也是唯一)的数据结构,表既可以当做数组来用,也可以当成哈希表来用。这个和Python中的字典非常类似,比如我们之前用查看变量类型的math.type,本质上就是以字符串"type"来检索表math。而在Python中,比如调用math.......
  • 汇编-程序文本结构
     assumecs:codesg//定义段名//cs表示代码段codesgsegmentstart:movax,0123Hmovbx,0456Haddax,bxaddax,axmovax,4c00h//交回程序控制权int21hcodesgendsend//程序结束 伪指令:定义段xxxsegment//段的开......
  • Qemu中生成针对具体体系结构的纯净代码的方法---利用GCC的-E选项
      实验室正在研究一个叫做Qemu的项目,外国人写的初始代码。里面很多内容是我们不需要的,但是却参杂在我们关注的代码中。突然想到了一个编译命令-E,它能够一下子就把那些不需要的代码过滤掉。以前几次开会大家都抱怨这个东西干扰信息太多,导致代码分析的连贯性总是被打断,进度特别慢......