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

废话不多说直接上代码

基础类

`@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. rust 神奇的特质

    pub trait Summary { fn summarize_author(&self) -> String; fn summarize(&self) -> Strin ...

  2. vs.net/vscode中使用Beetlex创建vue应用

    平时在开发Vue应用则需要安装nodejs,vue cli等相关东西相对来说麻烦一些:如果你喜欢像vs.net/vscode创建普通项目一样就能开发Vue项目的话那可以尝试一下BeetleX针对Vue ...

  3. weui上传多图片,前端压缩,base64编码

    记录一下在做一个报修功能的心路历程,需求功能很简单,一个表单提交,表单包含简单的文字字段以及图片 因为使用的是weui框架,前面的话去找weui的表单和图片上传组件,说实话,weui的组件写的还不错, ...

  4. Spring 中Controller 获取请求参数的方法笔记

    1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交.若"Content-Type"="application/ ...

  5. LeetCode 79,这道走迷宫问题为什么不能用宽搜呢?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第48篇文章,我们一起来看看LeetCode当中的第79题,搜索单词(Word Search). 这一题官方给的难 ...

  6. java 加密与解密艺术

    视频来自黑马程序员公开课 对称加密之后的密文可能存在乱码,这些乱码无法识别,信息经过加密后会变成一串毫无规律的二进制串,此时再选择一种编码方式来展示,通常是 BASE64 格式的编码. 为了解决这个问 ...

  7. 你的 IDEA 是如何配置的?卡不卡?试试这样配置

    本文作者在和同事的一次讨论中发现,对 IntelliJ IDEA 内存采用不同的设置方案,会对 IDE 的速度和响应能力产生不同的影响. Don't be a Scrooge and give you ...

  8. java代理,静态代理、jdk代理、cglib代理、Aspectj

    我实在接触spring的时候才接触到代理这个东西的,一直想整理一下笔记. 什么是代理模式:代理模式是通过代理对象访问目标对象,这样可以在目标对象基础上增强额外的功能.简单来说就是要创建一个新的对象,我 ...

  9. GitLab Runner部署(kubernetes环境)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  10. 一文说通MongoDB via Python操作

    Python并不仅仅是一个做Machine Learning的语言.   说到Python,一般都会感觉它关联着ML,如果不是做ML开发,就会觉得离自己很远.而实际上,作为一门语言,Python在应用 ...