1. 程式人生 > >Java實現遍歷N級樹形目錄結構

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