zoukankan      html  css  js  c++  java
  • 研究将有pid和id的List<Map<String,Map>>组成树

    树如图所示:

    方法一:用递归的方法,思路清晰但效率很慢并且不灵活:

    思路:递归查询,使用深度优先算法,第一遍找A-->B-->D,将D加到B中,再找B->E,将E加到B中,然后将B加到A中,然后找到A-->C-->F-->G,将G加到F中,将F加到C中,将C加到A中。

     1     /** 
     2      * 递归生成树
     3      * 方法详细描述
     4      *
     5      * @author 龙谷情
     6      * @date 2021/3/31 17:47
     7      * @param [list, pid, idNm, pidNm] 要处理的集合,很节点的父级id,id的键名,父级id的键名
     8      * @return java.util.List<java.util.Map<java.lang.String,java.lang.Object>>[返回类型说明]
     9      * @exception/throws [异常类型] [异常说明]
    10      * @since [v1.0]
    11      */
    12     public static List<Map<String, Object>> getTreeRecursion(List<Map<String, Object>> list, String pid, String idNm, String pidNm) {
    13         List<Map<String, Object>> res = new ArrayList<Map<String, Object>>();
    14         if (CollectionUtils.isNotEmpty(list)) {
    15             for (Map<String, Object> map : list) {
    16                 if ((pid == null && map.get(pidNm) == null) || (map.get(pidNm) != null && map.get(pidNm).equals(pid))) {
    17                     String id = (String) map.get(idNm);
    18                     map.put("children", getTreeRecursion(list, id, idNm,pidNm));
    19                     res.add(map);
    20                 }
    21             }
    22         }
    23         return res;
    24     }

    方法二:通过具体的地址索引进行生成,不用多次对list进行循环查询,效率较高

    思路:遍历list,将每个节点的父级id作为key,value是一个数组,保存自己和有相同父级id的其他节点,假设此map为treeNoteListMap,如果是根节点,保存到一个map中,设为tree,如果不是,则继续往下进行,查询treeNoteListMap中的key和此节点id相同的数组元素,将这个元素添加到这个节点下,如果没有,添加一个空的数组,遍历一遍,即可通过索引将树生成

        /** 
         * 不通过递归进行查询
         * 方法详细描述
         *
         * @author 赵学壮
         * @date 2021/3/31 17:56
         * @param [rootId, noteList, pidName, idName] 根节点id,待处理集合,id的键名,父级id的键名
         * @return java.util.Map[返回类型说明]
         * @exception/throws [异常类型] [异常说明]
         * @since [v1.0]
         */
        private static Map getTree(String rootId, List<Map<String, Object>> noteList,String pidName,String idName) {
    
            Map tree = null;
            Map<String,List<Map<String,Object>>> treeNoteListMap = new HashMap<>(16);
            for (Map<String,Object> note:noteList){
                if (rootId.equals(note.get(idName))){
                    tree = note;
                }
                if (StringUtils.isNotBlank(note.get(pidName).toString())){
                    List<Map<String,Object>> mapList = treeNoteListMap.get(note.get(pidName).toString());
                    if (null==mapList){
                        mapList = new ArrayList<>();
                    }
                    mapList.add(note);
                    treeNoteListMap.put(note.get(pidName).toString(),mapList);
                }
                if (null == treeNoteListMap.get(note.get(idName))){
                    treeNoteListMap.put(note.get(idName).toString(),new ArrayList<>());
                }
                note.put("children",treeNoteListMap.get(note.get(idName)));
            }
            return tree;
        }

     测试:

    一:小数据测试:

    测试代码如下:

     1 public static void main(String[] args) {
     2         String inId = "ida";
     3         List<Map<String,Object>> noteList = new ArrayList<>();
     4         Map<String,Object> note0 = new HashMap<>(16);
     5         note0.put("id","ida");
     6         note0.put("pid","");
     7         note0.put("name","A");
     8         noteList.add(note0);
     9 
    10         Map<String,Object> note1 = new HashMap<>(16);
    11         note1.put("id","idb");
    12         note1.put("pid","ida");
    13         note1.put("name","B");
    14         noteList.add(note1);
    15 
    16         Map<String,Object> note2 = new HashMap<>(16);
    17         note2.put("id","idc");
    18         note2.put("pid","ida");
    19         note2.put("name","C");
    20         noteList.add(note2);
    21 
    22         Map<String,Object> note5 = new HashMap<>(16);
    23         note5.put("id","idf");
    24         note5.put("pid","idc");
    25         note5.put("name","F");
    26         noteList.add(note5);
    27 
    28         Map<String,Object> note6 = new HashMap<>(16);
    29         note6.put("id","idg");
    30         note6.put("pid","idf");
    31         note6.put("name","G");
    32         noteList.add(note6);
    33 
    34         Map<String,Object> note3 = new HashMap<>(16);
    35         note3.put("id","idd");
    36         note3.put("pid","idb");
    37         note3.put("name","D");
    38         noteList.add(note3);
    39 
    40         Map<String,Object> note4 = new HashMap<>(16);
    41         note4.put("id","ide");
    42         note4.put("pid","idb");
    43         note4.put("name","E");
    44         noteList.add(note4);
    45 
    46 
    47         Long l1 = System.currentTimeMillis();
    48         Map tree = getTree(inId,noteList,"pid","id");
    49         Long l2 = System.currentTimeMillis();
    50         System.out.println(l2-l1);
    51         JSONObject object = new JSONObject(tree);
    52         System.out.println(object);
    53 
    54 
    55         Long l3 = System.currentTimeMillis();
    56         List<Map<String, Object>> treeRecursionList = getTreeRecursion(noteList,"","id","pid");
    57         Long l4 = System.currentTimeMillis();
    58         System.out.println(l4-l3);
    59         JSONObject objectRecursion = new JSONObject(treeRecursionList.get(0));
    60         System.out.println(objectRecursion);
    61     }
    View Code

    将获得的json结果格式化得到:

    {
        "children": [{
            "children": [{
                "children": [],
                "name": "D",
                "pid": "idb",
                "id": "idd"
            }, {
                "children": [],
                "name": "E",
                "pid": "idb",
                "id": "ide"
            }],
            "name": "B",
            "pid": "ida",
            "id": "idb"
        }, {
            "children": [{
                "children": [{
                    "children": [],
                    "name": "G",
                    "pid": "idf",
                    "id": "idg"
                }],
                "name": "F",
                "pid": "idc",
                "id": "idf"
            }],
            "name": "C",
            "pid": "ida",
            "id": "idc"
        }],
        "name": "A",
        "pid": "",
        "id": "ida"
    }
    昔日我曾苍老,如今风华正茂(ง •̀_•́)ง
  • 相关阅读:
    发送邮件
    C#操作Excel总结
    注意!监控MySQL服务是否正常,懂这4种方法就可以了
    Linux磁盘空间爆满怎么办?定时文件清理脚本配置实现
    Linux 服务器必备的安全设置,建议收藏!
    MySQL入门到精通:MySQL 选择数据库
    TIOBE3月榜单公布!C 语言稳居第一,将新增功能,消除差异
    C++如何读取带空格字符串?这5种方法教会你
    C语言丨二分查找算法详解(含示例代码)
    线上故障了!居然是因为Linux磁盘缓存机制导致的
  • 原文地址:https://www.cnblogs.com/lgqrlchinese/p/14602932.html
Copyright © 2011-2022 走看看