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