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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM