zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    C#跨窗体操作
    搞IT的不如去养鸡养猪了
    C# 委托实例(跨窗体操作控件)
    FastReport 自定义页长
    SQL 根据一个表更新另一个表的内容
    Delphi中用ADOQuery实现主从表的例子(转)
    旅行的意义
    嘉州影院的网址
    纯粹的人
    Delphi中流的使用:压缩与解压缩(TCompressionStream、TDecompressionStream)
  • 原文地址:https://www.cnblogs.com/tangyin/p/10097817.html
Copyright © 2011-2022 走看看