首页 > 其他分享 >list转树状结构 非递归 多个顶级节点 通用工具类

list转树状结构 非递归 多个顶级节点 通用工具类

时间:2024-03-21 14:59:25浏览次数:19  
标签:treeNode 递归 树状 List list util import parentNodeMap 节点

有时候,需要返给前端需要的树状结构数据。

需要后端转换组装。

做了个通用工具类,非递归方式,简单易用。

上代码:

树结构类:

package com.ruoyi.shop;

import lombok.Data;

import java.util.List;

/**
 * 返回前端树结构
 * @Author wql
 * @Date 2024/3/21 9:36
 */
@Data
public class TreeNode {
    private Long id;
    private String name;
    private Long parentId;
    private List<TreeNode> child;
    private Boolean selectEnable;
}

转换工具类:

import com.ruoyi.shop.TreeNode;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author : wuQingLiang
 * @date : 2024/3/21
 **/
public class TreeUtil {

    public static List<TreeNode> buildNodeTree(List<TreeNode> treeNodeList){
        List<TreeNode> treeTopNodeList=new ArrayList<>();//顶级节点列表
        //创建map key为parentId 用来储存同一parentId下的兄弟节点
        Map<Long,List<TreeNode>> parentNodeMap=new HashMap<>();
        //list转map node的id作为key 用来根据id快速判断是否有此节点
        Map<Long,TreeNode> nodeMap=treeNodeList.stream().collect(Collectors.toMap(node -> node.getId(), node -> node));
        for(TreeNode treeNode:treeNodeList){
            if(treeNode.getParentId()==null){ //没有parentId 为顶级节点
                treeTopNodeList.add(treeNode);
            }else {
                if(nodeMap.get(treeNode.getParentId())==null){ //有parentId 但传入的list列表中不存在 也就是在list中同样是顶级节点
                    treeTopNodeList.add(treeNode);
                }
                if(parentNodeMap.get(treeNode.getParentId())==null){ //parentNodeMap中是否存在此节点父节点的key项
                    List<TreeNode> childNodeList=new ArrayList<>(); //不存在 则放入此父节点的key项
                    childNodeList.add(treeNode);
                    parentNodeMap.put(treeNode.getParentId(), childNodeList);
                }else{ //存在 则兄弟节点list中加入此节点
                    List<TreeNode> childNodeList= parentNodeMap.get(treeNode.getParentId());
                    childNodeList.add(treeNode);
                }
            }


        }
        //顶级节点设置子节点
        for(TreeNode treeNode:treeTopNodeList){
            if(parentNodeMap.get(treeNode.getId())!=null){
                treeNode.setChild(parentNodeMap.get(treeNode.getId()));
            }
        }
        return treeTopNodeList;
    }
}

标签:treeNode,递归,树状,List,list,util,import,parentNodeMap,节点
From: https://blog.csdn.net/wuqingliang510/article/details/136908697

相关文章

  • C# 使用HttpListener时候异常(此平台不支持此操作:System.PlatformNotSupportedExceptio
    ​ C#使用HttpListener时候异常(此平台不支持此操作:System.PlatformNotSupportedException)代码:HttpListenerlistener=newHttpListener();错误:System.PlatformNotSupportedException:OperationisnotsupportedonthisplatformInSystem.Net.HttpListener..ctor()......
  • 如何理解递归算法?
     首先说说递归思想,我认为可以从以下三点进行把握:将大问题分解为有限个子问题;每个子问题的求解方式相同;存在已知的最小子问题,作为“归”的条件。 一句话解释:递归思想是将大问题分解为数个求解方式相同的子问题,且该问题具有已知的最小子问题。 另外,递归是分为两个......
  • 代码随想录第14天|二叉树的递归遍历
    二叉树的理论基础代码随想录(programmercarl.com)关于二叉树,你该了解这些!|二叉树理论基础一网打尽,二叉树的种类、二叉树的存储方式、二叉树节点定义、二叉树的遍历顺序_哔哩哔哩_bilibili二叉搜索树:二叉搜索树是一个有序树。左子树不为空,则左子树上所有节点的值均小于根......
  • 最基础树状数组
    1.单点加2.前缀和查询intn,m;inta[N];inttr[N];intlowbit(intx){ returnx&(-x);}voidadd(intpos,intk){ for(inti=pos;i<=n;i+=lowbit(i))tr[i]+=k;}intquery(intx){ intres=0; for(inti=x;i;i-=lowbit(i))res+=tr[i]; returnres;}voidsolve(......
  • Java递归拷贝文件夹
    importjava.io.*;importjava.util.Scanner;publicclassDemo{publicstaticvoidmain(String[]args){FilesrcDirFile=getDirFile("输入源文件夹路径");FiledestDirFile=getDirFile("输入目标路径");if(srcDirFile.e......
  • Java递归删除文件夹
    importjava.io.File;importjava.util.Scanner;publicclassDemo{publicstaticvoidmain(String[]args){FiledirFile=getDirFile();delDirFiles(dirFile);}/***递归删除文件夹里所有文件*/privatestaticvoi......
  • Java递归计算一个文件夹所有文件大小
    importjava.io.File;importjava.util.Scanner;publicclassDemo1{publicstaticvoidmain(String[]args){FiledirFile=getDirFile();System.out.println(countDirFile(dirFile));}/***计算文件夹大小*/public......
  • 复试C++15真题_程序设计2_递归_输入字符串倒序转整形
    编写一个递归函数,功能为:输入一个字符串,输出一个整数值。例如输入 "1a2xcz34,5a!6" , 输出654321。一开始想不明白怎么写递归,于是我写了迭代的函数。意识到,递归的过程就是实现了迭代的循环,而循环内的操作本质没有太大差别。于是就写出来了:#include<iostream>usingnam......
  • 从时间复杂度的角度出发,list和vector之间查找,插入,删除等数据操作的区别
    list和vector是STL(标准模板库)中常用的两种序列容器,它们各自在不同类型的操作上有着不同的优势。下面是list和vector在不同操作上的擅长之处:list的擅长操作插入和删除操作:list是一个双向链表,插入和删除元素时只需要调整相邻节点的指针,因此在中间或任意位置插入或删除元素时效率很......
  • Yolov9报错“IndexError: list index out of range”方法解决
     哈喽友友们好!今天继续分享关于yolov9的使用教程。 在使用yolov9的数据集时,你是否有类似的报错?如图作者本人一直查找问题,开始是想着数据集标签可能有问题,于是就更换数据集直到适合为止。但发现很多数据集还是会报这个错,只有少部分才能运行,这个方法治标不治本。 于是......