首页 > 其他分享 >list转换成树形结构

list转换成树形结构

时间:2023-05-23 14:34:55浏览次数:30  
标签:转换成 String map List list parentFieldName 树形 entityList public

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;

/**
 * list转换成树形结构
 */
@Component
public class ConvertorUtil<T> {


    public static String PRIMARY_FIELD_NAME = "id";
    public static String PARENT_FIELD_NAME = "pid";
    public static String CHILDREN_LIST = "childrenList";
    public static String PID_VALUE = "0";

    public static String PRIMARY_FIELD_ENDS_WITH= "Pid";
    public static String PARENT_FIELD_ENDS_WITH= "Id";

    /**
     * @param entityList       要转换的数据
     * @param primaryFieldName 主键ID
     * @param parentFieldName  父ID
     * @param childrenName     子集合属性名
     * @param pidValue         顶级父ID值
     * @return 树形结构list
     */
    @SuppressWarnings("unchecked")
    public List<T> listToTree(List<?> entityList, String primaryFieldName, String parentFieldName, String childrenName, String pidValue) {
        if (CollectionUtil.isEmpty(entityList)) {
            return new ArrayList<>();
        }
        Object o = entityList.get(0);
        if (StrUtil.isNotBlank(primaryFieldName) && StrUtil.isNotBlank(parentFieldName)) {
            primaryFieldName = PRIMARY_FIELD_NAME;
            parentFieldName = PARENT_FIELD_NAME;
        } else {
            Class<?> aClass = o.getClass();
            Field[] declaredFields = aClass.getDeclaredFields();
            for (Field field : declaredFields) {
                String name = field.getName();
                if (name.endsWith(PRIMARY_FIELD_ENDS_WITH)) {
                    parentFieldName = name;
                    primaryFieldName = parentFieldName.substring(0, parentFieldName.lastIndexOf(PRIMARY_FIELD_ENDS_WITH)) + PARENT_FIELD_ENDS_WITH;
                }
            }
        }
        if (StrUtil.isBlank(childrenName)) {
            childrenName = CHILDREN_LIST;
        }
        if (StrUtil.isNotBlank(pidValue)) {
            pidValue = PID_VALUE;
        }
        //返回的map Tree树形结构
        List<Map<String, Object>> treeMap = new ArrayList<>();
        //将传进的参数entityList转为MapList
        List<Map<String, Object>> listMap = JSON.parseObject(JSON.toJSONString(entityList), List.class);
        //声明一个map用来存listMap中的对象,key为对象id,value为对象本身
        Map<String, Map<String, Object>> entityMap = new Hashtable<>();
        //循环listMap把map对象put到entityMap中去
        for (Map<String, Object> map : listMap) {
            entityMap.put(map.get(primaryFieldName).toString(), map);
        }
        //循环listMap进行Tree树形结构组装
        for (Map<String, Object> map : listMap) {
            //获取map的pid
            Object pid = map.get(parentFieldName);
            //判断pid是否为空或者为0,为空说明是最顶级,直接add到返回的treeMap中去
            if (pid == null || StrUtil.equals(pid.toString(), pidValue)) {
                treeMap.add(map);
            } else {
                //如果pid不为空也不为0,是子集
                // 根据当前map的pid获取上级 parentMap
                Map<String, Object> parentMap = entityMap.get(pid.toString());
                if (parentMap == null) { //如果parentMap为空,则说明当前map没有父级,当前map就是顶级
                    treeMap.add(map);
                } else {
                    //如果parentMap不为空,则当前map为parentMap的子级
                    //取出parentMap的所有子级的List集合
                    List<Map<String, Object>> children = (List<Map<String, Object>>) parentMap.get(childrenName);
                    if (children == null) {  //判断子级集合是否为空,为空则新创建List
                        children = new ArrayList<>();
                        parentMap.put(childrenName, children);
                    }
                    //把当前map对象add到parentMap的子级List中去
                    children.add(map);
                }
            }
        }
        return JSONUtil.toList(String.valueOf(treeMap), null);
    }


    public List<T> listToTree(List<?> entityList) {
        return listToTree(entityList, "", "", "", "");
    }


    public List<T> listToTree(List<?> entityList, String primaryFieldName, String parentFieldName) {
        return listToTree(entityList, primaryFieldName, parentFieldName, "", "");
    }


    public List<T> listToTree(List<?> entityList, String primaryFieldName, String parentFieldName, String childrenName) {
        return listToTree(entityList, primaryFieldName, parentFieldName, childrenName, "");
    }

  

标签:转换成,String,map,List,list,parentFieldName,树形,entityList,public
From: https://www.cnblogs.com/418836844qqcom/p/17425094.html

相关文章

  • Java开发笔记之将一个List拷贝到另一个List的问题
    0x00概述在对List数据进行不同的数据操作的时候,例如分支1将List按照A来排序,分支2将List按照B来排序,需要将List进行数据层面的拷贝; 0x01错误的操作仅仅是List的引用,并没拷贝List内的数据进行处理List<String>list1=newArrayList<>();List<String>list2=newArrayL......
  • Flutter一天一控件之ListTile
    ListTile简介Flutter中的ListTile控件是一种常用的列表项控件,它可以用于显示列表中的每一个项,通常包含标题、副标题、图标等内容。ListTile控件的外观和行为类似于Android中的ListView中的列表项。一个简单的ListTile示例:ListTile(leading:Icon(Icons.person),//左侧图标......
  • 14-Filter&Listener&Ajax&Axios&JSON
    1,Filter1.1Filter概述Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。Servlet我们之前都已经学习过了,Filter和Listener我们今天都会进行学习。过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。如下图所示,浏览器可以访问服务器上的所有......
  • JavaWeb中Filter&Listener的神奇作用
    @[toc]1,Filter1.1Filter概述Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。如下图所示,浏览器可以访问服务器上的所有的资源(servlet、jsp、html等)而在访问到这些资源之前可以使过滤器拦截来下,......
  • 【CPP0040】list应用测试
    应用STL中的list完成功能测试。设计要求: 定义一个空的list,将用户输入的数组a[10]的10个数插入到list中,在list头部插入数b,用迭代器遍历list并输出其中的元素值。然后将list从大到小排序,删除list尾部的元素,用迭代器遍历list并输出其中的元素值。最后将list清空。#include<iostr......
  • java list.stream 多条件去重(分组)
    List<EmEventConfigPointExcelDto>listNew=list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(()->newTreeSet<>(Comparator.comparing((o)-......
  • Filter过滤和Listener监听器
    过滤器Filter简介Filter也称之为过滤器,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp,Servlet,静态图片文件或静态html文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能处理编码。它主要......
  • Filter过滤和Listener监听器
    过滤器Filter简介Filter也称之为过滤器,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp,Servlet,静态图片文件或静态html文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能处理编码。它主要......
  • org.apache.jasper.JasperException: /pages/role-list.jsp (行.: [145], 列: [8]) 根
    org.apache.jasper.JasperException:/pages/role-list.jsp(行.:[145],列:[8])根据标记文件中的TLD或attribute指令,attribute[items]不接受任何表达式 web.xml中版本号不兼容产生的问题;解决方法:<%@taglibprefix=“c”uri=“http://java.sun.com/jstl/core”%>改为<%@t......
  • 局部变量元素加入成员变量QList后,局部变量出了作用域后,为什么QList仍然可以获取元素的
    问题问题:现有一个成员变量QList,在函数中定义了一个局部变量的对象,并将该局部变量加入到QList中。当函数运行结束,局部变量也就出了作用域,这时,由于局部变量只是一个普通对象,而不是指针,所以,应该被销毁。但是,我们在外面仍然可以通过QList对象来访问之前加入进来的数据,这是为什么?实验......