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
?
轉載于:https://www.cnblogs.com/tangyin/p/10097817.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Java实现遍历N级树形目录结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 典型用户分析及用户场景分析
- 下一篇: JavaWeb-SpringBoot(抖