最近挺忙,一直在做项目,然后有个树形目录结构需要返回给前端,这里给大家说一下实现的思路。

   具体达到的效果类似:

      一级目录A:

        二级目录A:

          三级目录:

            四级目录:

              文件.txt

        二级目录B:

          文件1.txt

      一级目录B:

        文件2.txt

    

  表结构(没有把我代码的所有表结构都贴上,根据自身业务,参考实现逻辑):

  a、目录表

  ID     NAME         PID

  1       一级目录

  2       二级目录         1
       3       三级目录         2
       4       三级目录         2
       5      一级目录

 

  b、文件目录表

  ID     FileName         PID

  1  a.txt     1 

  2  a.txt     3

  3  a.txt     2

  4  a.txt     5

下面看代码实现

 

Controller方法  把两个表的数据查出来
public ApiResult getDirectoryStructure(HttpServletRequest request){
List<DocumentListVo> docListVo = new ArrayList<>();
List<document> doclist = documentServiceImpl.selectDocumentList();
List<DirectoryStructure> dirlist = directoryStructureServiceImpl.selectDirStrList();
if(doclist.size() > 0){
docListVo = TreeStructureUtil.getVolists(dirlist,doclist);
}
return new ApiResult(ApiResult.STATE_SUCCESS,"success",docListVo);
}
TreeStructureUtil文档树形目录结构工具类
public class TreeStructureUtil {
public static List<DocumentListVo> getVolists(List<DirectoryStructure> dirlist, List<document> doclist){
List<DocumentListVo> listvo = new ArrayList<>(); List<DirectoryStructure> dirlistPen = new ArrayList<>();//一级目录 //获取没有目录的文件,跟一级目录同级
for(int i=0;i<doclist.size();i++) {
document d = doclist.get(i);
if (d.getdSId() == null) {
DocumentListVo docvo = new DocumentListVo();
docvo.setName(d.getName());
docvo.setHashCode(d.getHashCode());
docvo.setUpdateTime(d.getUpdateTime());
listvo.add(docvo);
}
} if(dirlist.size() > 0){
//获取一级目录
for(int j=0;j<dirlist.size();j++){
DirectoryStructure dir = dirlist.get(j);
if(dir.getPid() == null){
dirlistPen.add(dir);
}
} //根据一级目录获取子目录和文件
if(dirlistPen.size() > 0){
for(int k = 0;k<dirlistPen.size();k++){
DirectoryStructure dir = dirlist.get(k);
DocumentListVo docvo = new DocumentListVo();
docvo.setName(dir.getName());
List<DocumentListVo> d = getVoDrenlist(dir.getId(),dirlist,doclist);//子目录
if(d.size() < 1){
for(int i = 0;i<doclist.size();i++){
document doc = doclist.get(i);
if(doc.getdSId() == dir.getId()){
DocumentListVo docvo1 = new DocumentListVo();
docvo1.setName(doc.getName());
docvo1.setHashCode(doc.getHashCode());
docvo1.setUpdateTime(doc.getUpdateTime());
d.add(docvo1);
}
}
}
docvo.setList(d);
listvo.add(docvo);
}
}
}
return listvo;
} /**
* 递归算法获取子目录和文件
* @param id
* @param dirlist
* @param doclist
* @return
*/
public static List<DocumentListVo> getVoDrenlist(Long id ,List<DirectoryStructure> dirlist,List<document> doclist){
List<DocumentListVo> listvo = new ArrayList<>();
for(int j=0;j<dirlist.size();j++){
DirectoryStructure dir = dirlist.get(j);
if(dir.getPid() == id){
DocumentListVo docvo = new DocumentListVo();
docvo.setName(dir.getName());
docvo.setList(getVoDrenlist(dir.getId(),dirlist,doclist));
listvo.add(docvo);
}
//循环完当前目录级,去看当前级下面有没有文件
if(j == (dirlist.size()-1)){
for(int i = 0;i<doclist.size();i++){
document doc = doclist.get(i);
if(doc.getdSId() == id){
DocumentListVo docvo1 = new DocumentListVo();
docvo1.setName(doc.getName());
docvo1.setHashCode(doc.getHashCode());
docvo1.setUpdateTime(doc.getUpdateTime());
listvo.add(docvo1);
}
}
}
}
return listvo;
}
}

最终前端拿到的结构这样的 有点多字体缩小了:

    

这样无论多少级 Java代码也可以变量出来,只要理顺逻辑使用递归是比较简单的。

技术QQ群:216868740

Java实现遍历N级树形目录结构的更多相关文章

  1. java打印树形目录结构

    import java.io.File; public class MainTest { public static void main(String[] args) { String dirname ...

  2. Linux文件系统的目录结构

    Linux下的文件系统为树形结构,入口为/ 树形结构下的文件目录: 无论哪个版本的Linux系统,都有这些目录,这些目录应该是标准的.各个Linux发行版本会存在一些小小的差异,但总体来说,还是大体差 ...

  3. Linux目录结构以及文件操作

    Linux目录结构 UNIX 是以目录为主的,Linux 也继承了这一优良特性. Linux 是以树形目录结构的形式来构建整个系统的,可以理解为树形目录是一个用户可操作系统的骨架.虽然本质上无论是目录 ...

  4. Linux 文件系统的目录结构

    http://www.jb51.net/LINUXjishu/151820.htmlLinux下的文件系统为树形结构,入口为/ 树形结构下的文件目录: 无论哪个版本的Linux系统,都有这些目录,这些 ...

  5. Maven学习-目录结构

    在前一篇文章中,我们介绍了什么是Maven,以及如何用Maven来构建我们的项目.不了解Maven的童鞋,可以看这里Maven学习-入门.在这篇文章中,我们将学习Maven的项目的目录结构相关的内容. ...

  6. Linux目录结构及文件基础操作

    一.Linux目录结构 windows系统中主要以存储介质为主(磁盘). UNIX和Linux系统中主要是以目录为主(以树形目录结构的形式构建整个系统). 1. FHS(Filesystem Hier ...

  7. (大数据工程师学习路径)第一步 Linux 基础入门----目录结构及文件基本操作

    Linux 目录结构及文件基本操作 介绍 1.Linux 的文件组织目录结构. 2.相对路径和绝对路径. 3.对文件的移动.复制.重命名.编辑等操作. 一.Linux 目录结构 在讲 Linux 目录 ...

  8. Linux目录结构及快捷键

    1.树形目录结构 2.最顶层:根目录 /bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动配置文件和脚本 /home 用户主目录的基点 /lib ...

  9. Linux系统的目录结构及常见目录总结

    Linux系统的目录结构(必须掌握的内容) 所有目录只有一个顶点/(根),所有目录的起点. 只有一棵树 Linux的目录结构也是有规律的,而且也是按照类别组织的. 应用程序 /usr/bin 数据文件 ...

随机推荐

  1. 解决git Failed to connect to 127.0.0.1 port xxxx: Connection refused

    某天,用git拉取,提交代码的时候出现了git Failed to connect to 127.0.0.1 port xxxx: Connection refused的问题, 开始百度,看了一通.都 ...

  2. CYQ.Data 支持分布式数据库(主从备)高可用及负载调试

    前言: 继上一篇,介绍 CYQ.Data 在分布式缓存上支持高可用,详见:CYQ.Data 对于分布式缓存Redis.MemCache高可用的改进及性能测试 本篇介绍 CYQ.Data 在对数据库层面 ...

  3. kafka集群broker频繁挂掉问题解决方案

    现象:kafka集群频繁挂掉 排查日志:查看日志文件[kafkaServer.out],发现错误日志:ERROR Shutdown broker because all log dirs in /tm ...

  4. break、continue以及return的区别

    break.continue以及return的区别如下: 1.break break用于完全结束一个循环,跳出循环体,不再执行下面的代码.对于多层循环嵌套,如果break语句出现在嵌套循环中的内循环时 ...

  5. MyWebViewDemo【封装Webview常用配置和选择文件、打开相机、录音、打开本地相册的用法】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 封装webview的常用配置和选择文件.打开相机.录音.打开本地相册的用法.[如果想要使用简单的预览功能,可以参考<MyBri ...

  6. asp.netcore 深入了解配置文件加载过程

    前言     配置文件中程序运行中,担当着不可或缺的角色:通常情况下,使用 visual studio 进行创建项目过程中,项目配置文件会自动生成在项目根目录下,如 appsettings.json, ...

  7. 补习系列(17)-springboot mongodb 内嵌数据库

    目录 简介 一.使用 flapdoodle.embed.mongo A. 引入依赖 B. 准备测试类 C. 完善配置 D. 启动测试 细节 二.使用Fongo A. 引入框架 B. 准备测试类 C.业 ...

  8. 搞懂MySQL分区

    一.InnoDB逻辑存储结构 首先要先介绍一下InnoDB逻辑存储结构和区的概念,它的所有数据都被逻辑地存放在表空间,表空间又由段,区,页组成. 段 段就是上图的segment区域,常见的段有数据段. ...

  9. C# 添加Word页眉、页脚和页码

    在Word文档中,我们可以通过添加页眉.页脚的方式来丰富文档内容.添加页眉.页脚时,可以添加时间.日期.文档标题,文档引用信息.页码.内容解释.图片/LOGO等多种图文信息.同时也可根据需要调整文字或 ...

  10. Python二级-----------程序冲刺5

    1. 编写程序,从键盘上获得用户连续输入且用逗号分隔的若干个数字(不必以逗号结尾),计算所有输入数字的和并输出,给出代码提示如下.‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪ ...