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

   具体达到的效果类似:

      一级目录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. SQL SERVER 查看所有存储过程或视图里 包含某个关键字的查询语句

    SELECT name, type_desc FROM sys.all_sql_modules s INNER JOIN sys.all_objects o ON s.object_id = o.ob ...

  2. Microsoft Edge浏览器下载文件乱码修复方法(二)

    之前有写过"Microsoft Edge浏览器下载文件乱码修复方法",发现很多情况下下载文件乱码问题还是存在,这里对之前内容做简单补充,希望可以帮到大家. 方法二: 默认如果提示下 ...

  3. hibernate出现QueryException: could not resolve property 查询异常

    可能是你的属性名写错了,  因为hibernate是面向对象和属性的.

  4. 第5章 简单的C程序设计——循环结构程序设计

    5.1 为什么需要循环控制 前面介绍了程序中常用到的顺序结构和选择结构,但是只有这两种结构是不够的,还需要用到循环结构(或称重复结构).因为在程序所处理的问题中常常遇到需要重复处理的问题. 循环结构和 ...

  5. ipv6地址抓包分析

    拓扑图: 因为多路由,所以采用ospf配置将路由实现互通,从而进行抓包 ospf配置以R1为例 查看R4路由表 做完进行ping通测试 R4pingR3 R4pingR5 进行抓包分析 128报文 1 ...

  6. Spring Cloud Eureka 注册中心集群搭建,Greenwich 最新版!

    Spring Cloud 的注册中心可以由 Eureka.Consul.Zookeeper.ETCD 等来实现,这里推荐使用 Spring Cloud Eureka 来实现注册中心,它基于 Netfl ...

  7. 测试 ASP.NET Core API Controller

    本文需要您了解ASP.NET Core MVC/Web API, xUnit以及Moq相关知识. 这里有xUnit和Moq的介绍: https://www.cnblogs.com/cgzl/p/917 ...

  8. Vue.js-03:第三章 - 事件修饰符的使用

    一.前言 熟悉了 Vue 的指令系统后,在实际开发中,不可避免的会使用到对于事件的操作,如何处理 DOM 事件流,成为我们必须要掌握的技能.不同于传统的前端开发,在 Vue 中给我们提供了事件修饰符这 ...

  9. 死磕 java集合之ConcurrentHashMap源码分析(三)

    本章接着上两章,链接直达: 死磕 java集合之ConcurrentHashMap源码分析(一) 死磕 java集合之ConcurrentHashMap源码分析(二) 删除元素 删除元素跟添加元素一样 ...

  10. 限定项目的 Node.js 版本

    限定项目运行所需的 Node.js 版本可保证项目在一个稳定可预期的环境中运行,减少不必要的故障.甚至有些依赖库只能工作于某些版本下.同时,不加以限制的话,在多人合作的项目中恐怕会引起环境不一致带来的 ...