Java實現遍歷N級樹形目錄結構
阿新 • • 發佈:2018-12-10
最近挺忙,一直在做專案,然後有個樹形目錄結構需要返回給前端,這裡給大家說一下實現的思路。
具體達到的效果類似:
一級目錄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