有时候我们需要将列表结构的数据转成树形结构的数据

废话不多说直接上代码

基础类

`@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不需要递归列表转树形结构的更多相关文章

  1. java中实现无限层级的树形结构

    本文展示了两个实现方法的代码.两个代码的实现方法不同,代码2更为简单. 先看一下最后实现的结果: 最后结果-json 代码1: 实现过程: 1.传入一段json字符串 2.将字符串转换成对象存入节点列 ...

  2. 公用表表达式CTE简单递归使用-简单树形结构

    1.建表脚本 CREATE TABLE [dbo].[tb_tree]( ,) NOT NULL, [ParentId] [int] NULL, ) NULL, CONSTRAINT [PK_tb_t ...

  3. js文章列表的树形结构输出

    文章表设计成这样了 后端直接给了无任何处理的json数据,现在要前端实现树形结构的输出,其实后端处理更简单写,不过既然来了就码出来 var doclist = [{ "id": 1 ...

  4. 递归、嵌套for循环、map集合方式实现树形结构菜单列表查询

    有时候, 我们需要用到菜单列表,但是怎么样去实现一个菜单列表的编写呢,这是一重要的问题. 比如我们需要编写一个树形结构的菜单,那么我们可以使用JQuery的zTree插件:http://www.tre ...

  5. java树形结构工具类

    一.树形结构数据一般都是以子父id的形式存在数据库中,查询的时候只是带有子id和parent_id的List集合 并不是树形结构,所以我们现在要将普通的List集合转换为树结构数据(本工具类扩展操作树 ...

  6. 使用递归算法结合数据库解析成java树形结构

    使用递归算法结合数据库解析成java树形结构 1.准备表结构及对应的表数据a.表结构: create table TB_TREE ( CID NUMBER not null, CNAME VARCHA ...

  7. 《Java数据结构》树形结构

    树形结构是一层次的嵌套结构. 一个树形结构的外层和内层有相似的结构, 所以这种结构多可以递归的表示.经典数据结构中的各种树形图是一种典型的树形结构:一颗树可以简单的表示为根, 左子树, 右子树. 左子 ...

  8. JAVA获取树形结构

    package com.nnmzkj.common.dto; import lombok.Data; import java.io.Serializable;import java.util.Arra ...

  9. Java实现树形结构的数据转Json格式

    在项目中难免会用到树形结构,毕竟这是一种常用的组织架构.楼主这里整理了两个实现的版本,可以直接拿来使用,非常方便. 楼主没有单独建项目,直接在以前的一个Demo上实现的.第一种,看下面代码: pack ...

随机推荐

  1. shellcode 免杀(一)

    工具免杀 选择了几个简单或者近期还有更新的免杀工具进行学习 ShellcodeWrapper https://github.com/Arno0x/ShellcodeWrapper 该工具的原理是使用异 ...

  2. 图解 Git 基本命令 merge 和 rebase

    Git 基本命令 merge 和 rebase,你真的了解吗? 前言 Git 中的分支合并是一个常见的使用场景. 仓库的 bugfix 分支修复完 bug 之后,要回合到主干分支,这时候两个分支需要合 ...

  3. 几个超级实用但很少人知道的 VS 技巧

    大家好,今天分享几个我知道的实用 VS 技巧,而这些技巧我发现很多人都不知道.因为我经常在工作中遇到:我在同事电脑上解决问题,或在会议上演示代码示例时,使用了一些 VS "骚"操作 ...

  4. 如何修改linux下tomcat指定的jdk路径

    一般情况下,一台服务器只跑一个项目,只需根据所需项目,将linux默认的jdk环境配置好即可.某些时候一台服务器上会跑多个项目,而且各个项目需要的JDK版本各不相同,或者为了使业务独立开来,需要指定T ...

  5. 分词搜索 sphinx+php+mysql

    sphinx3.1.1的安装与使用 下载sphinx3.1.1 wget http://sphinxsearch.com/files/sphinx-3.1.1-612d99f-linux-amd64. ...

  6. 二分查找法demo

    正文 中午闲着有点时间,做个demo睡觉去,这个例子网上应该都有,自己只是敲一下给自己做个记录. public static void main(String[] args) { int[] whit ...

  7. 硬件对同步的支持-TAS和CAS指令

    目录 Test and Set Compare and Swap 使用CAS实现线程安全的数据结构. 现在主流的多处理器架构都在硬件水平上提供了对并发同步的支持. 今天我们讨论两个很重要的硬件同步指令 ...

  8. Data Science and Matrix Optimization-课程推荐

    课程介绍:Data science is a "concept to unify statistics, data analysis, machine learning and their ...

  9. Elastic认证考试,请先看这一篇

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/wojiushiwo987/article ...

  10. hive命令查询数据不显示表头解决办法

    在hive命令行中查询数据如下: 表头未显示出来 解决办法: 修改hive安装包conf/hive-site.xml配置文件: <property> <name>hive.cl ...