Java实现遍历N级树形目录结构
最近挺忙,一直在做项目,然后有个树形目录结构需要返回给前端,这里给大家说一下实现的思路。
具体达到的效果类似:
一级目录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级树形目录结构的更多相关文章
- java打印树形目录结构
import java.io.File; public class MainTest { public static void main(String[] args) { String dirname ...
- Linux文件系统的目录结构
Linux下的文件系统为树形结构,入口为/ 树形结构下的文件目录: 无论哪个版本的Linux系统,都有这些目录,这些目录应该是标准的.各个Linux发行版本会存在一些小小的差异,但总体来说,还是大体差 ...
- Linux目录结构以及文件操作
Linux目录结构 UNIX 是以目录为主的,Linux 也继承了这一优良特性. Linux 是以树形目录结构的形式来构建整个系统的,可以理解为树形目录是一个用户可操作系统的骨架.虽然本质上无论是目录 ...
- Linux 文件系统的目录结构
http://www.jb51.net/LINUXjishu/151820.htmlLinux下的文件系统为树形结构,入口为/ 树形结构下的文件目录: 无论哪个版本的Linux系统,都有这些目录,这些 ...
- Maven学习-目录结构
在前一篇文章中,我们介绍了什么是Maven,以及如何用Maven来构建我们的项目.不了解Maven的童鞋,可以看这里Maven学习-入门.在这篇文章中,我们将学习Maven的项目的目录结构相关的内容. ...
- Linux目录结构及文件基础操作
一.Linux目录结构 windows系统中主要以存储介质为主(磁盘). UNIX和Linux系统中主要是以目录为主(以树形目录结构的形式构建整个系统). 1. FHS(Filesystem Hier ...
- (大数据工程师学习路径)第一步 Linux 基础入门----目录结构及文件基本操作
Linux 目录结构及文件基本操作 介绍 1.Linux 的文件组织目录结构. 2.相对路径和绝对路径. 3.对文件的移动.复制.重命名.编辑等操作. 一.Linux 目录结构 在讲 Linux 目录 ...
- Linux目录结构及快捷键
1.树形目录结构 2.最顶层:根目录 /bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动配置文件和脚本 /home 用户主目录的基点 /lib ...
- Linux系统的目录结构及常见目录总结
Linux系统的目录结构(必须掌握的内容) 所有目录只有一个顶点/(根),所有目录的起点. 只有一棵树 Linux的目录结构也是有规律的,而且也是按照类别组织的. 应用程序 /usr/bin 数据文件 ...
随机推荐
- Kindle Windows版本 中文字体修改工具
近来想要用Windows看Kindle电子书,无奈Windows 版本的Kindle不能修改中文字体,非常难看.把Kindle拉到IDA PRO看了一下,发现Kindle Windows版本的中文字体 ...
- #001 Python 00号作业:关于课程
请大家继续思考,你希望我们的课程主要涉略哪些方面?你希望我们的课程能够带给你哪些基本的技能?你希望理论课应该怎么上,实验课应该怎么上?对于我们的课程有什么建议或意见 作为一名计算机专业的学生,对于py ...
- Linux iptables用法与NAT
1.相关概念 2.iptables相关用法 3.NAT(DNAT与SNAT) 相关概念 防火墙除了软件及硬件的分类,也可对数据封包的取得方式来分类,可分为代理服务器(Proxy)及封包过滤机制(IP ...
- AI - TensorFlow - 可视化工具TensorBoard
TensorBoard TensorFlow自带的可视化工具,能够以直观的流程图的方式,清楚展示出整个神经网络的结构和框架,便于理解模型和发现问题. 可视化学习:https://www.tensorf ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十二 || 三种跨域方式比较,DTOs(数据传输对象)初探
更新反馈 1.博友@落幕残情童鞋说到了,Nginx反向代理实现跨域,因为我目前还没有使用到,给忽略了,这次记录下,为下次补充.此坑已填 2.提示:跨域的姊妹篇——<三十三║ ⅖ 种方法实现完美跨 ...
- Python基础(max,min方法)
max函数(min函数使用方法一致): #-----------------max函数----------------- #max之简单层次的使用 li=[1,0,2,45,12,-2,7,9] re ...
- SystemUI
1.Status bars(状态栏) 2.Navigation bars(导航栏) 3.Notification(通知) 4.Keyguard(锁屏) 5.Quick settings(快速设置) 6 ...
- 【Android Studio安装部署系列】十八、Android studio更换APP应用图标
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio新建项目后会有一个默认图标,那么如何更换图标呢? 替换图标 这个方案不建议直接在已有项目上更换图标,建议 ...
- C++11 (多线程)并发编程总结
| 线程 std::thread 创建std::thread,一般会绑定一个底层的线程.若该thread还绑定好函数对象,则即刻将该函数运行于thread的底层线程. 线程相关的很多默认是move语义 ...
- dotnet core 微服务教程
这个教程主要是对于第一次使用dotnet core开发的同学. 运行环境是在centos 7 , 使用了docker容器. 即这是一篇运行在linux的docker容器上的微服务的简单应用. 一. 安 ...