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 ...
随机推荐
- cb19a_c++_只适合string类型的操作_提取_追加_替换
*cb19a_c++_只适合string类型的操作_提取_追加_替换三个substr重载函数-获取一个字符串的一部分六个append重载函数-追加字符十个replace重载函数-替换更换 重载函数越多 ...
- vulstack红队评估(四)
一.环境搭建: ①根据作者公开的靶机信息整理 虚拟机密码: ubuntu: ubuntu:ubuntu win7: douser:Dotest123 Win2008 DC: administr ...
- Linux nohup命令详解,终端关闭程序依然可以在执行!
大家好,我是良许. 在工作中,我们很经常跑一个很重要的程序,有时候这个程序需要跑好几个小时,甚至需要几天,这个时候如果我们退出终端,或者网络不好连接中断,那么程序就会被中止.而这个情况肯定不是我们想看 ...
- WeChair项目Alpha冲刺(5/10)
团队项目进行情况 1.昨日进展 Alpha冲刺第五天 昨日进展: 前端:完成小程序登录态的定义 后端:成功部署项目到服务器并能通过域名访问项目 数据库:调整属性数据类型 2.今日安排 前端:完善 ...
- Zookeeper面试专题
Zookeeper面试专题 1. Zookeeper是什么框架 分布式的.开源的分布式应用程序协调服务,原本是Hadoop.HBase的一个重要组件.它为分布式应用提供一致性服务的软件,包括:配置维护 ...
- java 基本类型详解 及 常见问题
鄙人不才,基础不好,趁着闲时简单学习一下,仅作学习分享,如有不正确地方还请各位看客不吝指出. 常用的基本类型有:byte(8).short(16).char(16,取值从0-65535[2^16-1] ...
- CentOS 安装 VMware Tools 详细方法
点击虚拟机,选择安装vmware Tools工具 弹出上面的界面,右键选择奖上面的vmwaraTools.tar.gz解压到你要解压的目录下面 记得一定要使用root用户,进入到解压的目录 然后执行 ...
- SSM框架出现500的错误解决办法
1,先确认pom.xml中有没有导入项目依赖, 2,发现导入之后还是报500.点击File->Project Structure->Artifacts 点击SSM右键,选择put int ...
- Java基础Day07(Map Calender Date 包装类 System类 异常)
1.Map Map是集合容器,存放的元素有键与值两部分组成,通过键可以找到所对应的值,键和值必须是引用数据类型,键是唯一的,不能重复,没有顺序. HashMap是Map的实现类. Map的添加,删除, ...
- Linux 操作系统!开篇!!!
此篇文章主要会带你介绍 Linux 操作系统,包括 Linux 本身.Linux 如何使用.以及系统调用和 Linux 是如何工作的. Linux 简介 UNIX 是一个交互式系统,用于同时处理多进程 ...