树如图所示:

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

思路:递归查询,使用深度优先算法,第一遍找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 }

将获得的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"
}

研究将有pid和id的List<Map<String,Map>>组成树的更多相关文章

  1. APUE学习之三个特殊位 设置用户ID(set-user-ID),设置组ID(set-group-ID),sticky

    设置用户ID(set-user-ID),设置组ID(set-group-ID),sticky   set-user-ID: SUID      当文件的该位有设置时,表示当该文件被执行时,程序具有文件 ...

  2. 进程ID[PID(Process ID)]与端口号[(Port ID)]的联系

    1.首先声明一点:PID不是端口(port id),而是Process ID进程号的意思. 2.那么,什么是进程号? 采集网友的意见就是: 进程号,是系统分配给么一个进程的唯一标识符.PID就是各进程 ...

  3. Java分割ID和姓名(String不能当输出参数)

    ID:包括数字和字母 姓名:汉字 package org.ah; import org.ah.utils.Utils; public class Test { public static void m ...

  4. 分布式ID生成器解决方案

    一.分布式系统带来ID生成挑战 在复杂的系统中,往往需要对大量的数据如订单,账户进行标识,以一个有意义的有序的序列号来作为全局唯一的ID; 而分布式系统中我们对ID生成器要求又有哪些呢? 全局唯一性: ...

  5. Solr入门(一)

    一丶Solr入门1.Solr的启动Solr各版本下载老版本的时候,需要将war包放到tomcat中,现在只需解压,由于自带jetty容器,可以直接启动 [root@aaa bin]# ./solr s ...

  6. java 框架-企业级搜索 Solr

    https://blog.csdn.net/cs_hnu_scw/article/details/79388080 一:Solr简介       Solr是一个独立的企业级搜索应用服务器,它对外提供类 ...

  7. 手把手教你如何玩转Solr(包含项目实战)

    一:Solr简介       Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引 ...

  8. Golang核心编程

    源码地址: https://github.com/mikeygithub/GoCode 第1章 1Golang 的学习方向 Go 语言,我们可以简单的写成 Golang 1.2Golang 的应用领域 ...

  9. SpringBoot-总结

    SpringBoot一站式开发 官网:https://spring.io/projects/spring-boot Spring Boot可以轻松创建独立的.基于Spring的生产级应用程序,它可以让 ...

  10. Restful 介绍及SpringMVC+restful 实例讲解

    restful不是一个框架,称为一种编码更烦更贴切吧,其核心类位于spring-web.jar中,即RestTemplate.class restful是rpc通过http协议的一种实现方式,和web ...

随机推荐

  1. 移除任务栏右端"显示桌面"按钮-AutoIt

    核心代码 $hwnd = WinGetHandle("[CLASS:Shell_TrayWnd]", "") ControlHide($hwnd, " ...

  2. zk基础—1.一致性原理和算法

    大纲 1.分布式系统特点 2.分布式系统的理论 3.两阶段提交Two-Phase Commit(2PC) 4.三阶段提交Three-Phase Commit(3PC) 5.Paxos岛的故事来对应Zo ...

  3. DPDI(Dispatch PDI)kettle调度管理平台环境部署升级

    1.DPDI演示环境 DPDI online登录域名:http://dpdi.pizzalord.site 用户名:dpdi 密 码:dpdi 2.DPDI下载 DPDI online部署包下载地址: ...

  4. web自动化:webdriver常用api

    一.获取操作 1.get('url'):访问指定的url webdriver.get(String url); 2.Getcurrenturl():获取当前页面url webDriver.getCur ...

  5. 企业级分布式MCP方案

    飞书原文档链接地址:https://ik3te1knhq.feishu.cn/wiki/D8kSwC9tFi61CMkRdd8cMxNTnpg 企业级分布式 MCP 方案 背景:现阶段 MCP Cli ...

  6. 我的C/C++开发环境

    我的C/C++开发环境 OS: WSL Ubuntu Compiler: gcc Editor: VS Code Extensions: C/C++ Extenion Pack Settings: 时 ...

  7. 【BUG】Python3|安装python3-pip依赖缺失,might want to run ‘apt --fix-broken install‘ to correct these. unment

    今天装python,版本装错了. 然后删又删不掉,装pip又装不上,报错是这样的: 想装的时候: 7f2a0f717aa3:~/$ sudo apt-get install python3-pip p ...

  8. 鸿蒙Next元服务开发详解

    之前写过关于元服务的文章,大家对元服务应该也有一定的了解,它是一种更加高效便捷的应用形式,免安装,有独立的入口,说的简单一点就像是把微信小程序放到系统层面,相比微信小程序更加快捷,因为连微信也不用打开 ...

  9. 探秘Transformer系列之(32)--- Lookahead Decoding

    探秘Transformer系列之(32)--- Lookahead Decoding 目录 探秘Transformer系列之(32)--- Lookahead Decoding 0x00 概述 0x0 ...

  10. NOIP模拟赛(10.17):语言,色球,斐波,偶数

    语言 题面: 牛妹正在学习一种新的语言,在这种语言里,单词只有形容词(\(\texttt{A}\)),名词(\(\texttt{N}\))和动词(\(\texttt{V}\))三种词性.但是一个单词可 ...