三层目录建树

Python GDAL读取gdb地理数据库中的矢量数据 geodatabase地理数据库简称gdb数据库,是arcgis\qgis中常用的地理数据库,可以存储各类点线面类型的矢量数据shapefile(shp/dbf/shx)。 本文介绍gdb的数据的读取,具体包含:获取要素图层的属性字段、属性字段值表、形状点坐标。语言python,版本3.7,GDAL包...... 阅读详情

关键思想:

  • 1

最终返回给前台的是一个实体类,该类应该有一个Children字段(实体类属性中具有,或者继承方法来获得,本例子用的是继承)用来接受它的子元素,子元素同样也是该类,也具有Children字段(层层套娃);

  • 2

遍历数据库所有元素,将一级元素(父id等于0)直接添加到树中,(其实就是放在该类中),作为基础;

  • 3

然后嵌套循环进行再次遍历数据库,进行判断,如果有A元素的父id等于另外一个B元素的id,就将A元素添加到B元素的Children字段中进行储存,也就是将A元素作为B元素的子级;遍历完成之后,每个元素具有的子元素都被安排的明明白白,层级关系建立完成

  • 4
    这样返回到前台就是这样的数据
    在这里插入图片描述
    建立完成

具体步骤及演示代码

- 1:数据库建立

数据库元素应该具有自身id,父id来区别层级
在这里插入图片描述

- 2:进行数据库元素的全部查询


@Override
public List<GoodsCategoryTree> selectTree(GoodsCategory goodsCategory) {
   System.out.println("进入selectTree方法。。。");
   List<GoodsCategory> list = this.list(Wrappers.lambdaQuery(goodsCategory));
   System.out.println("打印进入gettree的list"+list);
   return getTree(this.list(Wrappers.lambdaQuery(goodsCategory)));
}

/**
 * 构建树
 *
 * @param entitys
 * @return
 */
private List<GoodsCategoryTree> getTree(List<GoodsCategory> entitys) {
   List<GoodsCategoryTree> treeList = entitys.stream()
         //过滤(当前id不等于它的父类id)
         .filter(entity -> !entity.getId().equals(entity.getParentId()))
         //同级类目,根据Sort排序
         .sorted(Comparator.comparingInt(GoodsCategory::getSort))
         //复制bean
         .map(entity -> {
            GoodsCategoryTree node = new GoodsCategoryTree();
            //转换类型(其实无所谓换不换都一样,两个类基本属性一样)
            //转换后,流输出就变成了List<GoodsCategoryTree>
            BeanUtil.copyProperties(entity,node);
            return node;
         }).collect(Collectors.toList());
         //将返回的list集合放进树形工具类中,处理后返回
   return TreeUtil.build(treeList, CommonConstants.PARENT_ID);
}

①selectTree方法中只是将数据库的数据按照条件查询出来,(一般不限制条件,限制的话也不能限制parentId,限制了会导致树形结构一级没有内容,后面返回到前台的就是空的)并放入getTree方法中;
②getTree方法主要是将查询到的数据转换成流,并进行筛选、排序、转换类等操作,最后以List< GoodsCategoryTree >的形式放入TreeUtil.build()方法中;
③TreeUtil.build()方法是整个树形的核心;通过两层循环,将每个元素都互相做比较,如果是其子类就放进去到它的children字段中,然后将parentId等于0的元素放入需要返回到前台的类中,也就是List< GoodsCategoryTree >类中;返回就是分层的实体类;
代码如下:

/**
 * @author
 */
@UtilityClass
public class TreeUtil {
   /**
    * 两层循环实现建树
    *
    * @param treeNodes 传入的树节点列表
    * @return
    */
   //因为改类继承了TreeNode类,所以才会有该类的addChildren方法
   public <T extends TreeNode> List<T> build(List<T> treeNodes, Object root) {
      //T 类型为 GoodsCategoryTree  root = 0
      List<T> trees = new ArrayList<>();
      //遍历 list中每一个元素为treeNode
      for (T treeNode : treeNodes) {
         //先把父id等于0的,也就是第一级添加到树结构中
         if (root.equals(treeNode.getParentId())) {
            //如果元素父类id为0,就添加
            trees.add(treeNode);
//          trees.sort(Comparator.comparing(TreeNode::getSort));
         }
         //就再次遍历所有,包括已经添加到树中的
         for (T it : treeNodes) {
            //遍历所有,如果有元素的父id等于该元素的id,就成为其子类,不管几层,最后都会按层级排序
            if (it.getParentId().equals(treeNode.getId())) {
               treeNode.addChildren(it);
//             treeNode.getChildren().sort(Comparator.comparing(TreeNode::getSort));
            }

         }
      }
      return trees;
   }

其中泛型T是方法传进来的,这里也就是List< GoodsCategoryTree >类,看一下实体类:

/**
 * 商品类目
 *
 * @author JL
 * @date 2019-08-12 11:46:28
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class GoodsCategoryTree extends TreeNode {

   /**
    * 所属租户
    */
   @ApiModelProperty(value = "所属租户")
   private String tenantId;
   /**
    * (1:开启;0:关闭)
    */
   @ApiModelProperty(value = "1:开启;0:关闭")
   private String enable;
   /**
    * 父分类编号
    */
   @ApiModelProperty(value = "父分类编号")
   private String parentId;
   /**
    * 名称
    */
   @ApiModelProperty(value = "名称")
   private String name;
   /**
    * 描述
    */
   @ApiModelProperty(value = "描述")
   private String description;
   /**
    * 图片
    */
   @ApiModelProperty(value = "图片")
   private String picUrl;
   /**
    * 排序
    */
   @ApiModelProperty(value = "排序")
   private Integer sort;
   /**
    * 创建时间
    */
   @ApiModelProperty(value = "创建时间")
   private LocalDateTime createTime;
   /**
    * 最后更新时间
    */
   @ApiModelProperty(value = "最后更新时间")
   private LocalDateTime updateTime;
   /**
    * 逻辑删除标记(0:显示;1:隐藏)
    */
   @ApiModelProperty(value = "逻辑删除标记")
   private String delFlag;
   /**
    * 跳转页面
    */
   @ApiModelProperty(value = "跳转页面")
   private String page;
}

并没有children字段,但是需要用到这个字段来进行子元素的存储,前文也提到,要么建字段,要么继承有这个字段的类,这里选择的继承类;

//因为改类继承了TreeNode类,所以才会有该类的addChildren方法
public <T extends TreeNode> List<T> build(List<T> treeNodes, Object root)

继承的这个类

package com.uk.mall.cloud.common.core.entity;

import lombok.Data;

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

/**
 * @author
 */
@Data
public class TreeNode {
//在本方法中需要用到的属性写上
   protected String id;
   protected String parentId;
   private Integer sort;
   protected List<TreeNode> children = new ArrayList<>();

   public void addChildren(TreeNode treeNode) {
      children.add(treeNode);
   }

   public List<TreeNode> getChildren() {
      if(children.size()<=0){
         return null;
      }
      return children;
   }
}

继承的类里面需要写上在这个方法中需要用到的属性,因为在该类中暂时类型还是泛型T,所以无法通过.get的方法来获取参数属性,继承类可以解决;

- 3:分层完成,返回前端页面即可;

需要多加分层只需要添加相应的元素,将父id指向已存在的id就行

进行举例子

具体问题

需要对部门进行分层级展示

数据库数据

在这里插入图片描述

对应的实体类

/**
 * 部门表
 * @author byChen
 * @date 2021/8/18
 */
@Data
@TableName("wx_depart")
public class WxDepart {
   /**
    * 主键id
    */
   @TableId(type = IdType.AUTO)
   private Integer id;
   /**
    *创建的部门id
    */
   private Long deptId;
   /**
    *部门名称
    */
   private String name;
   /**
    *英文名称
    */
   private String enName;
   /**
    *父部门id
    */
   private Long parentId;
   /**
    *在父部门中的次序值。order值大的排序靠前。值范围是[0, 2^32)
    */
   private Long departOrder;
   /**
    * 下级部门
    * 存储下级元素
    */
   @TableField(exist = false)
   private List<WxDepart> children;
}

具体代码


/**
 * 根据层级递归获取
 *
 * @return
 * @throws WxErrorException
 */
@RequestMapping(value = "/queryByLevel", method = RequestMethod.GET)
public R queryByLevel() throws WxErrorException {
   List<WxDepart> tree = new ArrayList<>();
   //所有部门
   List<WxDepart> list = wxDepartService.list();
   for (WxDepart wxDepart : list) {
      //当前部门id
      Long deptId = wxDepart.getDeptId();
      if (deptId == 0) {
         //底层树节点建立
         tree.add(wxDepart);
      }
      //再次遍历所有,找到当前部门的下级,并存入
      for (WxDepart wxDepart2 : list) {
         if (wxDepart2.getParentId().equals(wxDepart.getDeptId())) {
         //不能直接调用children,进行赋值,会报空指针
            List<WxDepart> list1 = new ArrayList<>();
            list1.add(wxDepart2);
            wxDepart.setChildren(list1);
         }
      }
   }
   return R.ok(list);
}

返回结果

TreeView树形目录的建立,数据库为Sqlite unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, DBGridEhGrouping, StdCtrls, DB, ASGSQLite3, GridsEh, DBGridEh,   ComCtrl 阅读详情

相关推荐

控制台图形化打印二叉树(c/c++)

用c/c++实现的控制台图形化打印二叉树

Ajzab的博客 1万+

Hutool Tree 顶级树只会显示id

发现该树顶级节点,只有一个id字段,子节点字段存在完整,我把树顶级节点,其他字段手动塞进去了,得到的结果如下。

m0_71084406的博客 456

互联网协议 — D-IP(确定性的)网络架构

目录 文章目录目录D-IP D-IP 确定性服务最早在 IETF DetNet 工作组被提出来,旨在为数据流提供确定性低时延及低抖动的 IP 层转发,并孵化出 DIP(Deterministic IP)技术。 DIP(Deterministic IP,确定性 IP 网络)技术,在 IPv6 包头中唯一新增的 Flow Label 字段,为基于流差异化服务提供了更方便的网络层识别方式,使得路由器对流的识别不再依赖传统的五元组,可以在不解析 TCP/UDP 四层传输层包头的条件下,实现对流的精准识别,并匹配相应

烟云的计算 1万+

GDB库多图层同时分发:将gdb库中每个图层按条件分发至标准库

GDB库多图层同时分发:将gdb库中每个图层按条件分发至标准库

wytp_vanity的博客 274

一个简单的二级目录树

extjs 目录树 二级 一个简单的二级目录树

Linux操作系统的源代码目录树结构图

Linux操作系统的源代码目录树结构图,介绍了linux系统的目录结构

三级分类:递归树形结构数据

【项目笔记】三级分类:递归树形结构数据 注意要熟悉 stream 写法 @Override public List<CategoryEntity> listWithTree() { //1.查出所有分类 List<CategoryEntity> entities = baseMapper.selectList(null); ...

积木 1677

无限级树形(三层开发)源码

无限级树形(三层开发)

tree命令详解(输出目录树层结构,显示目录和文件)

你也想要生成这个目录树层结构吗?显示目录和文件吗?只需要用“tree命令”即可!效果如下: 一、tree命令 安装 mac 下使用 brew包管理工具: linux 下使用yum安装: 二、tree命令怎么使用? 安装成功后,直接在终端使用,使用 --help 查看帮助信息。 语法: 参数说明: 用法示例: 输出你的树层目录结构cd 目标文件夹路径 然后 tree 一下,会将该层级下所有文件都遍历了输出,不管层级有多深。以树状图列出当前目录结构。可直接使用如下命令: 三、tree命令常用技巧 1、我们

达拉崩巴斑得贝迪卜多比鲁翁_ 3万+

OneNet平台MQTT连接避坑指南:C语言Token计算实战(附完整代码)

本文详细解析了OneNet平台MQTT连接中的Token计算机制,提供了C语言实现的完整代码和实战指南。通过HMAC算法和Base64编码,开发者可以高效生成安全凭证,避免常见连接问题,适用于物联网设备开发。

weixin_29193359的博客 461

一文解释电路中常用电子元器件应用和选型01

电容和二极管是电路中最常用的两个电子元器件,种类和系列众多,这里简单总结一下应用场景和选型方式 电容(Capacitor) 电容的种类(20种以上)和应用非常广泛,但是我经常遇到的无非就是下面这几种: 应用 1.隔直流。 2.旁路(去耦) 3.耦合 4.滤波 5.温度补偿 6.计时 7.调谐 8.整流 9.储能 种类 1. 陶瓷电容 2. 云母电容 3. 铝电解电容 4. 钽

weixin_43904073的博客 2236

一种从数据库利用xml创建树型目录的方法(C#)(一)

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 523

Score Matching(得分匹配)

Score Matching(得分匹配)是一种统计学习方法,用于估计概率密度函数的梯度(即得分函数),而无需知道密度函数的归一化常数。这种方法由Hyvärinen在2005年提出,主要用于无监督学习,特别是在密度估计和生成模型中。

weixin_39699362的博客 2167

三层交换综合实验

目标: 搭建: 思路: 配置: 1、eth-trunk sw1和sw2 [sw1]interface Eth-Trunk 0 [sw1-Eth-Trunk0]q [sw1-GigabitEthernet0/0/1]eth-trunk 0 sw1和sw2的两个口都这么配 2、TRUNK干道 [sw1]port g [sw1]port- [sw1]port-gro [sw1]port-group g [sw1]port-group group-memb...

Endofyearmix的博客 445

【Python脚本】Python自动大麦网抢票,准点原价秒杀演唱会门票,拒绝黄牛交易!从我做起!!!1

你是否错过了周杰伦的票,最近又没抢到五月天的票,不要太难过,今晚有张学友的票,后天还有张杰的票,加油哦!

weixin_45841831的博客 6万+

2023 ICRA《Visual Language Maps for Robot Navigation》阅读笔记

视觉语言导航可以使用预先训练的现有的视觉语言模型来将图像与对象目标的自然语言描述相匹配,但它与绘制环境的过程仍然脱节,缺乏经典几何地图的空间精度。为了解决这个问题,我们提出了VLMaps,这是一种空间地图表示,它将预训练的视觉语言特征与物理世界的3D重建直接融合在一起。VLMaps可以使用标准探索方法从机器人上的视频馈送中自主构建,并在没有额外标记数据的情况下实现地图的自然语言索引。具体来说,当与大型语言模型(LLM)相结合时,VLMaps可以用于。

qq_44100524的博客 1990

SWUST OJ# 利用中序和前序遍历求后序遍历

目录 题目 思路 代码 暴力建树 递归深搜 题目 思路 首先先要把三种遍历弄明白 前序遍历:★根->左孩子->右孩子 中序遍历:左孩子->★根->右孩子 后序遍历:左孩子->右孩子->★根 关键突破点就是遍历时根节点的位置 根据定义,前序遍历的第一个节点即是根节点。 找到根节点,再确定根节点在中序序列中的位置,就可以分出左右两棵子树。 然后再在已知的左右子树中,故技重施,再次按照上述步骤,再次 找到左右孩子的根节点,再确定左右孩子的根节

qq_62102968的博客 524

COMSOL有限元仿真深度指南:为结构件添加预应变

一、什么是预应力和预应变? 我们知道,结构力学问题中,结构件在外载荷作用下产生变形响应以吸收外载荷做功带来的能量;而在结构内部,整体的受力和变形则是通过固体微元的应力与应变传递的。 对于线弹性材料来说,应力与应变的关系可以线性表达,也即 σ=Dεσ = Dεσ=Dε ;在该式中,无论固体微元的应变程度多大,弹性矩阵DDD都是一个不变的常值。而对于超弹性材料来说,应力与应变的关系则需要通过应变能密度函数WWW来表征(详细参加博客《COMSOL有限元仿真深度指南:超弹性模型有限元分析入门》)。 从上面我们也不难

忘了面孔的Batou 7170

「D12-D16」功能拓展与深度优化3

本文介绍了Git代码仓库管理工具的深度优化与功能拓展方案。主要内容包括: 功能拓展: 实现分支/标签切换功能,通过全局状态管理自动刷新相关数据 新增仓库内文件搜索功能,基于本地索引实现快速检索 深度优化: 采用可视节点扁平化(visibleNodes)技术优化目录树渲染 实现三层LRU缓存机制提升数据加载效率 通过请求版本控制解决并发请求乱序问题 使用isolate隔离代码高亮处理,避免大文件卡顿 技术实现: 提供完整的Provider状态管理方案 展示缓存管理器的具体实现代码 详细说明各优化点的技术实现细

2401_84972713的博客 669

Ansys Lumerical双层扭曲液晶偏振光栅仿真:宽角度衍射效率优化

Ansys Lumerical双层扭曲液晶偏振光栅仿真研究 摘要 本文采用Ansys Lumerical软件平台,对双层扭曲液晶偏振光栅的宽角度衍射特性进行系统仿真研究。针对6μm周期的液晶光栅结构,以1050nm、1064nm和1550nm三个近红外波段为研究对象,在±40°入射角范围内优化平均衍射效率。研究基于液晶材料的双折射特性(Δn=0.135),通过构建两层扭曲方向相反的液晶层结构,扫描0-90°单层扭曲角度和不同厚度参数,利用RCWA求解器进行严格耦合波分析~~~~~~~

huanghm88的专栏 164

1. 迈进 SAP UI5 开发世界的第一步 - Hello World

SAP UI5 是一个用于开发企业级 Web 应用的前端框架,基于 HTML 和 JavaScript. 作为教程的第一步,我们需要了解最基础的 HTML 知识。 请大家在电脑上任意新建一个文件夹,将其命名,比如我取的名称为 Walkthrough. 进入 Walkthrough 文件夹,再新建一个文件夹名叫 01,代表本教程的第一个步骤。 进入 01 文件夹,新建一个 webapp 文件夹。这个名称是 web 应用约定俗成所使用的,大家都倾向于用这个名称,当然你要是想用其他名称也没有问题。......

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 9004

高级搜索-线段树[C/C++]

对于求数组区间和我们可以处理出前缀和后可以在O(1)的时间内计算出任意区间和,但是前缀和的缺点在于一旦区间发生改变我们就要重新计算前缀和,当频繁进行区间操作时前缀和的优势荡然无存,所以我们需要一种数据结构来解决这类需求。**线段树(segment tree)**是分治思想在线性数据上的一种应用,通过把一段区间不断分治为小区间来进行建树。我们把一段区间不断向下二分,会发现整体的结构形似一棵二叉树。线段树是基于分治思想的二叉树,用来维护区间信息(区间信息,区间最值,区间gcd等),可以在logn。

EQUINOX1的博客 2667

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【NO.62】LeetCode HOT 100—208. 实现 Trie (前缀树)

208. 实现 Trie (前缀树)

wang_luwei的博客 1122

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java 树的构建_Java8从构建树形结构

总体思路:利用Java8的新特性Lambda和流的map、collect,不断的递归调用得到树形结构另:如果想得到无限层的话,把level的限制放开,构造并返回自定义的数据结构就可以了代码如下public ItemCatResult queryItemCatsNew() {//声明一个存储的对象,然后构建对象ItemCatResult result=new ItemCatResult();List...

weixin_35906794的博客 1692

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【初阶数据结构11】——链式二叉树知识补充

本文介绍了二叉树的核心操作实现,主要包括层序遍历、完全二叉树判断、创建与销毁等内容。层序遍历通过队列实现广度优先搜索;完全二叉树的判断依据层序遍历中空节点的出现位置;二叉树的创建采用前序递归方式,销毁则采用后序遍历确保安全释放内存。文章还补充了二叉树的基本性质,如第i层最多2^(i-1)个节点、n0=n2+1等关系。这些操作为后续二叉树OJ题解奠定了基础,展示了二叉树处理的关键技术和方法。

一名零基础编程小白的成长历程 547

开发者指南:go-binsize-treemap 项目架构、测试规范与 6 个可扩展方向

**go-binsize-treemap** 是一款纯 Go 编写的 **Go 二进制体积可视化工具**:它读取 `go tool nm` 输出的符号表,把可执行文件中每个包、每个函数占用的字节数,渲染成一张 **SVG 矩形树图(Treemap)**。你只需一条管道命令,就能看清 Hugo(约 62MB)、CockroachDB(约 71MB)这类大型 Go 项目的体积都花在了哪里。 ## 一

gitblog_00985的博客 892
上一篇: redisTemplate
下一篇: Excal导入
Adda_Chen
博客等级 码龄7年 1213粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值