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

   具体达到的效果类似:

      一级目录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相关的操作

    给大家分享下git的使用心得,有不足的请大家补充: 克隆:git clone https://XXXXX 克隆指定分支:git clone -b https://XXXX 添加所有:git add . ...

  2. Git:一、简介&安装Git 2.20.1

    0.Git官网 1.简介 一个分布式版本控制系统. 作用:自动记录每次文件的改动,还可以让同伴协作编辑. 分布式与集中式相比优点在于:版本库在每个人自己电脑上,不需要一直在网上,也不用担心某一个数据库 ...

  3. Windows提示 错误: RPC 服务器不可用 解决方法。

    试验环境: 本地主机:win10  ip:192.168.0.10 远程主机: win2008 R2   ip:192.168.1.128 我想要通过systeminfo去获取远程主机的系统信息,但是 ...

  4. Django【部署】uwsgi+nginx

    uwsgi 遵循wsgi协议的web服务器 uwsgi的安装 pip install uwsgi uwsgi的配置 项目部署时,需要把settings.py文件夹下的: DEBUG = FALSE A ...

  5. r.js合并实践

    项目中用到require.js做生产时模块开发,但上线要合并压缩,幸好它配套有r.js.下面就其用法说明一下. 首先建一个目录,里面的结构如下: require.js可以到r.js项目下载 r.js可 ...

  6. java中并发下的集合类

    java中常见的集合类大部分是非线程安全的,在多线程情况下会报并发修改异常(ConcurrentModificationException) 并发下的ArrayList类: //集合类不安全的例子 p ...

  7. GitHub的Repository权限将public转为private

    2019年1月7日,GitHub CEO Nat Friedman 于官方博客公开发文,称“New year, new GitHub”,宣布从此将免费无限地为普通用户提供私有仓库服务. 因此,我们可以 ...

  8. 【深度学习】--DCGAN从入门到实例应用

    一.前述 DCGAN就是Deep Concolutions应用到GAN上,但是和传统的卷积应用还有一些区别,最大的区别就是没有池化层.本文将详细分析卷积在GAN上的应用. 二.具体 1.DCGAN和传 ...

  9. with open为什么会自动关闭文件流

    操作文件我们通常需要手动关闭文件流,可是通过with open()的时候却可以自动关闭,这是为什么呢?其实这就是上下文管理器.我们来看一个例子 #!/usr/bin/env python # -*- ...

  10. Spring Boot 2.0 的快速入门(图文教程)

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! Spring Boot 2.0 的快速入门(图文教程) 大家都 ...