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 数据文件 ...
随机推荐
- 自己手动搭建jenkins教程
下载列表; http://updates.jenkins-ci.org/download/war/ 本次下载: http://updates.jenkins-ci.org/download/war/ ...
- SVN的安装与配置
单独安装 SVN:1.安装:yum -y install subversionmkdir -p /data/svn/ 创建创库目录svnadmin create /data/svn/repos 构建版 ...
- ASP.NET Aries 高级开发教程:Excel导入之代码编写(番外篇)
前言: 以许框架提供的导入配置功能,已经能解决95%以上的导入情况,但有些情况总归还是得代码来解决. 本篇介绍与导入相关的代码. 1.前端追加导入时Post的参数: var grid = new AR ...
- invokedynamic字节码指令
1. 方法引用和invokedynamic invokedynamic是jvm指令集里面最复杂的一条.本文将从高观点的角度下分析invokedynamic指令是如何实现方法引用(Method refe ...
- 3. VIM 系列 - 遇见你的第一个插件
目录 1. 插件管理利器 vim-plug 1.1 安装插件管理器 1.2 配置插件管理器 1.3 安装插件 1.4 更新插件 1.5 回滚插件 1.6 卸载插件 1. 插件管理利器 vim-plug ...
- Linux下Springboot解决`APR based Apache Tomcat Native library`提示
最近转行做java,开发基于Springboot的项目,版本号为2.1.0.RELEASE. 启动应用,发现以下提示: The APR based Apache Tomcat Native libra ...
- Redis in .NET Core 入门:(1) 安装和主要功能简介
Redis(https://redis.io/), 是一个内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 安装Redis 我很少在开发机中直接装各种数据库,我一般使用Docker,针对 ...
- Entity Framework 异常: 'OFFSET' 附近有语法错误。\r\n在 FETCH 语句中选项 NEXT 的用法无效。
在使用 EF 的时候,突然发现更新后在服务器中运行出错,异常信息主要包含以下信息: 'OFFSET' 附近有语法错误.\r\n在 FETCH 语句中选项 NEXT 的用法无效.\r\n关键字 'AS' ...
- .NET Core微服务之基于EasyNetQ使用RabbitMQ消息队列
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.消息队列与RabbitMQ 1.1 消息队列 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更 ...
- MySQL高可用复制管理工具 —— Orchestrator使用
背景 在上一篇「MySQL高可用复制管理工具 —— Orchestrator介绍」中大致介绍了Orchestrator的功能.配置和部署,当然最详细的说明可以查阅官方文档.本文开始对Orchestra ...