java不需要递归列表转树形结构
有时候我们需要将列表结构的数据转成树形结构的数据
废话不多说直接上代码
基础类
`@Data
public class TreeNode {
private Long id;
private Long parentId;
private List<TreeNode> childrenList;
}工具类
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
树形结构工具类.
@date: 2020-5-8
@version: 1.0
@author: liyanglin
*/
public class TreeNodeUtil {/**
将列表转换成树。
@param treeNodeList 列表数据
@param rootId 根节点id
@param rootType 根节点id类型 1-将rootId与id值相等的作为根节点,2-将rootId与parentId值相等的作为根节点
@param
@return 返回树结构数据
*/
public static List listToTree(List treeNodeList, Long rootId, int rootType) {
// 储存根节点集合
List baseNodes = new ArrayList<>();
// 节点id->对应的节点
HashMap<Long, TreeNode> sonMap = new HashMap<>(baseNodes.size());
// 节点id->节点对应的子节点
HashMap<Long, List> parentMap = new HashMap<>(baseNodes.size());for (T currentNode : treeNodeList) {
Long currentId = currentNode.getId();
Long parentId = currentNode.getParentId();// 把节点先放在Map中,为了以后获取当前节点的父节点
sonMap.put(currentId, currentNode); if (parentMap.get(parentId) == null) {
parentMap.put(parentId, new ArrayList<>());
}
//将子节点加入父节点
parentMap.get(parentId).add(currentNode); // 判断当前节点是否有父节点
if (sonMap.get(parentId) != null) {
if (sonMap.get(parentId).getChildrenList() == null) {
sonMap.get(parentId).setChildrenList(new ArrayList<>());
}
// 将当前节点添加到父节点中
sonMap.get(parentId).getChildrenList().add(currentNode);
} // 判断当前节点是否有子节点
if (!CollectionUtils.isEmpty(parentMap.get(currentId))) {
//将所有的子节点加入到当前节点
currentNode.setChildrenList(parentMap.get(currentId));
} //根据节点id过滤根节点
if (rootType == 1 && currentNode.getId().longValue() == rootId.longValue()) {
baseNodes.add(currentNode);
} //根据父节点id过滤根节点
if (rootType == 2 && currentNode.getParentId().longValue() == rootId.longValue()) {
baseNodes.add(currentNode);
}
}
return baseNodes;
}
』测试类
public class TreeToListTest {
@Test
public void test() throws Exception {List treeNodes=new ArrayList<>();
treeNodes.add(createNode(1L,0L));
treeNodes.add(createNode(2L,10L));
treeNodes.add(createNode(3L,11L));
treeNodes.add(createNode(4L,3L));
treeNodes.add(createNode(5L,3L));
treeNodes.add(createNode(6L,31L));
treeNodes.add(createNode(7L,13L));
treeNodes.add(createNode(8L,2L));
treeNodes.add(createNode(9L,2L));
treeNodes.add(createNode(10L,1L));
treeNodes.add(createNode(11L,1L));
treeNodes.add(createNode(12L,1L));
treeNodes.add(createNode(13L,1L));List treeNodeList1=TreeNodeUtil.listToTree(treeNodes,1L,1);
}
』`
java不需要递归列表转树形结构的更多相关文章
- java中实现无限层级的树形结构
本文展示了两个实现方法的代码.两个代码的实现方法不同,代码2更为简单. 先看一下最后实现的结果: 最后结果-json 代码1: 实现过程: 1.传入一段json字符串 2.将字符串转换成对象存入节点列 ...
- 公用表表达式CTE简单递归使用-简单树形结构
1.建表脚本 CREATE TABLE [dbo].[tb_tree]( ,) NOT NULL, [ParentId] [int] NULL, ) NULL, CONSTRAINT [PK_tb_t ...
- js文章列表的树形结构输出
文章表设计成这样了 后端直接给了无任何处理的json数据,现在要前端实现树形结构的输出,其实后端处理更简单写,不过既然来了就码出来 var doclist = [{ "id": 1 ...
- 递归、嵌套for循环、map集合方式实现树形结构菜单列表查询
有时候, 我们需要用到菜单列表,但是怎么样去实现一个菜单列表的编写呢,这是一重要的问题. 比如我们需要编写一个树形结构的菜单,那么我们可以使用JQuery的zTree插件:http://www.tre ...
- java树形结构工具类
一.树形结构数据一般都是以子父id的形式存在数据库中,查询的时候只是带有子id和parent_id的List集合 并不是树形结构,所以我们现在要将普通的List集合转换为树结构数据(本工具类扩展操作树 ...
- 使用递归算法结合数据库解析成java树形结构
使用递归算法结合数据库解析成java树形结构 1.准备表结构及对应的表数据a.表结构: create table TB_TREE ( CID NUMBER not null, CNAME VARCHA ...
- 《Java数据结构》树形结构
树形结构是一层次的嵌套结构. 一个树形结构的外层和内层有相似的结构, 所以这种结构多可以递归的表示.经典数据结构中的各种树形图是一种典型的树形结构:一颗树可以简单的表示为根, 左子树, 右子树. 左子 ...
- JAVA获取树形结构
package com.nnmzkj.common.dto; import lombok.Data; import java.io.Serializable;import java.util.Arra ...
- Java实现树形结构的数据转Json格式
在项目中难免会用到树形结构,毕竟这是一种常用的组织架构.楼主这里整理了两个实现的版本,可以直接拿来使用,非常方便. 楼主没有单独建项目,直接在以前的一个Demo上实现的.第一种,看下面代码: pack ...
随机推荐
- 在IntelliJ IDEA中注释使用的说明
/** * @author 标明该类模块的开发作者 * @version 标明该类模块的版本 * @see 参开转向,也就是相关的主题 * @param 对方法中的某些参数进行说明 * @return ...
- 【JMeter_06】JMeter逻辑控制器__If控制器<If Controller>
If控制器<If Controller> 业务逻辑: 根据表达式的结果来决定是否执行控制器下的脚本内容,与编程语言中的if判断逻辑大致相同,表达式结果为布尔值 true或false; 当表 ...
- SpringCloud(一)版本选择
Springboot版本 官网:https://spring.io/projects/spring-boot 在官网上 springboot已经更新到最新2.2.6 Spingcloud版本 官网:h ...
- 【原创】强撸基于 .NET 的 Redis Cluster 集群访问组件
Hello 大家好,我是TANZAME,我们又见面了.今天我们来聊聊怎么手撸一个 Redis Cluster 集群客户端,纯手工有干货,您细品. 随着业务增长,线上环境的QPS暴增,自然而然将当前的单 ...
- IDEA自定义类注释和方法注释(自定义groovyScript方法实现多行参数注释)
一.类注释 1.打开设置面板:file -> setting -> Editor -> file and code Templates 选择其中的inclues选项卡,并选择File ...
- leetcode27之移除元素
题目描述: 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度. 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改 ...
- 如何用 React 构建前端架构
早期的前端是由后端开发的,最开始的时候仅仅做展示,点一下链接跳转到另外一个页面去,渲染表单,再用Ajax的方式请求网络和后端交互,数据返回来还需要把数据渲染到DOM上.写这样的代码的确是很简单.在We ...
- Eureka心跳健康检查机制和Spring boot admin 节点状态一直为DOWN的排查(忽略某一个节点的健康检查)
https://www.jdon.com/springcloud/eureka-health-monitoring.html 运行阶段执行健康检查的目的是为了从Eureka服务器注册表中识别并删除不可 ...
- JavaWeb网上图书商城完整项目--day02-12.激活功能各层实现
1.我们来看程序的代码 数据库层: 1.通过激活码查找到对应的用户 2.设置用户的激活状态 2.业务层 1.通过数据库接口通过验证码得到对应的用户 2.判断当用户是否为空,如果没有通过激活码查找到对应 ...
- java程序员软件测试技巧
测试是开发的一个非常重要的方面,可以在很大程度上决定一个应用程序的命运.良好的测试可以在早期捕获导致应用程序崩溃的问题,但较差的测试往往总是导致故障和停机. 测试是开发的一个非常重要的方面,可以在很大 ...