java遍历树_Java实现遍历N级树形目录结构
最近挺忙,一直在做項目,然后有個樹形目錄結(jié)構(gòu)需要返回給前端,這里給大家說一下實現(xiàn)的思路。
具體達(dá)到的效果類似:
一級目錄A:
二級目錄A:
三級目錄:
四級目錄:
文件.txt
二級目錄B:
文件1.txt
一級目錄B:
文件2.txt
表結(jié)構(gòu)(沒有把我代碼的所有表結(jié)構(gòu)都貼上,根據(jù)自身業(yè)務(wù),參考實現(xiàn)邏輯):
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
下面看代碼實現(xiàn):
Controller方法 把兩個表的數(shù)據(jù)查出來
publicApiResult getDirectoryStructure(HttpServletRequest request){
List docListVo = new ArrayList<>();
List doclist =documentServiceImpl.selectDocumentList();
List dirlist =directoryStructureServiceImpl.selectDirStrList();if(doclist.size() > 0){
docListVo=TreeStructureUtil.getVolists(dirlist,doclist);
}return new ApiResult(ApiResult.STATE_SUCCESS,"success",docListVo);
}
TreeStructureUtil文檔樹形目錄結(jié)構(gòu)工具類
public classTreeStructureUtil {public static List getVolists(List dirlist, Listdoclist){
List listvo = new ArrayList<>();
List dirlistPen = new ArrayList<>();//一級目錄//獲取沒有目錄的文件,跟一級目錄同級
for(int i=0;i
document d=doclist.get(i);if (d.getdSId() == null) {
DocumentListVo docvo= newDocumentListVo();
docvo.setName(d.getName());
docvo.setHashCode(d.getHashCode());
docvo.setUpdateTime(d.getUpdateTime());
listvo.add(docvo);
}
}if(dirlist.size() > 0){//獲取一級目錄
for(int j=0;j
DirectoryStructure dir=dirlist.get(j);if(dir.getPid() == null){
dirlistPen.add(dir);
}
}//根據(jù)一級目錄獲取子目錄和文件
if(dirlistPen.size() > 0){for(int k = 0;k
DirectoryStructure dir=dirlist.get(k);
DocumentListVo docvo= newDocumentListVo();
docvo.setName(dir.getName());
List d = getVoDrenlist(dir.getId(),dirlist,doclist);//子目錄
if(d.size() < 1){for(int i = 0;i
document doc=doclist.get(i);if(doc.getdSId() ==dir.getId()){
DocumentListVo docvo1= newDocumentListVo();
docvo1.setName(doc.getName());
docvo1.setHashCode(doc.getHashCode());
docvo1.setUpdateTime(doc.getUpdateTime());
d.add(docvo1);
}
}
}
docvo.setList(d);
listvo.add(docvo);
}
}
}returnlistvo;
}/*** 遞歸算法獲取子目錄和文件
*@paramid
*@paramdirlist
*@paramdoclist
*@return
*/
public static List getVoDrenlist(Long id ,List dirlist,Listdoclist){
List listvo = new ArrayList<>();for(int j=0;j
DirectoryStructure dir=dirlist.get(j);if(dir.getPid() ==id){
DocumentListVo docvo= newDocumentListVo();
docvo.setName(dir.getName());
docvo.setList(getVoDrenlist(dir.getId(),dirlist,doclist));
listvo.add(docvo);
}//循環(huán)完當(dāng)前目錄級,去看當(dāng)前級下面有沒有文件
if(j == (dirlist.size()-1)){for(int i = 0;i
document doc=doclist.get(i);if(doc.getdSId() ==id){
DocumentListVo docvo1= newDocumentListVo();
docvo1.setName(doc.getName());
docvo1.setHashCode(doc.getHashCode());
docvo1.setUpdateTime(doc.getUpdateTime());
listvo.add(docvo1);
}
}
}
}returnlistvo;
}
}
最終前端拿到的結(jié)構(gòu)這樣的 有點多字體縮小了:
這樣無論多少級 Java代碼也可以變量出來,只要理順邏輯使用遞歸是比較簡單的。
技術(shù)QQ群:216868740
總結(jié)
以上是生活随笔為你收集整理的java遍历树_Java实现遍历N级树形目录结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA 代码交互率低的原因分析,深入剖
- 下一篇: 如何将word中的对象怎么显示到工具栏_