当前位置: 首页 > news >正文

数形结构转换工具类

项目中使用了很多树状结构,为了方便使用开发一个通用的工具类。
使用工具类的时候写一个类基础BaseNode,如果有个性化字段添加到类里面,然后就可以套用工具类。
工具类会将id和pid做关联返回一个树状结构的集合。使用了hutool的工具包判空。
依赖
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.25</version> </dependency>
工具类TreeUtil.java
`import cn.hutool.core.util.ObjUtil;
import com.iccb.BaseNode;

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

public class TreeUtil {

public static <T extends BaseNode<T>> List<T> toTree(List<T> treeNodeList) {//数据按照pid分组Map<Long, List<T>> map = treeNodeList.stream().collect(Collectors.groupingBy(T :: getPid,LinkedHashMap::new,Collectors.toList()));//找出所有的根节点,pid=-1的为根节点List<T> areaList = map.get(-1L);if(ObjUtil.isEmpty(areaList)){return new ArrayList<>();}for (T areaVO : areaList) {forEach(map, areaVO);}return areaList;
}
private static  <T extends BaseNode<T>> void forEach(Map<Long, List<T>> collect, T areaVO) {List<T> nodeList = collect.get(areaVO.getId());if (collect.get(areaVO.getId()) == null) {return;}areaVO.setChildren(nodeList);for (T node : nodeList) {forEach(collect, node);}
}

}`

BaseNode.java
`import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**

  • @author admin
    */
    @Data
    public class BaseNode implements Serializable {

    private static final long serialVersionUID = 1L;

    @JsonFormat(shape = JsonFormat.Shape.STRING)
    private Long id;

    @JsonFormat(shape = JsonFormat.Shape.STRING)
    private Long pid;

    private String value;

    private List children;
    }`

使用范例
返回树状结构的地区数据

1)首先构建数据VO
`@EqualsAndHashCode(callSuper = true)
@Data
public class AreaVO extends BaseNode {

private static final long serialVersionUID = 1L;private String areaCode;private String label;private String level;private String lnglat;

}`

2)查询地区数据
List<Area> list = areaService.list();

  1. 构建数据VO 或者 直接使用mapper查询用VO封装
    List<AreaVO> collect = list.stream().map(i -> { AreaVO areaVO = BeanUtil.copyProperties(i, AreaVO.class); areaVO.setLabel(i.getAreaName()); areaVO.setValue(String.valueOf(i.getId())); areaVO.setLevel(i.getAreaLevel()); areaVO.setPid(i.getParentId()); return areaVO; }).collect(Collectors.toList());

  2. 使用工具类构造数据结构
    List<AreaVO> areaTree = TreeUtil.toTree(collect);

数据返回示例
{ "code": 200, "msg": null, "data": [ { "id": "4058069977868140544", "value": "4058069977868140544", "pid": "4058069977868148888", "children": [ { "id": "4058069978245627904", "value": "4058069978245627904", "pid": "4058069977868140544", "children": [ { "id": "4058069978530840576", "value": "4058069978530840576", "pid": "4058069978245627904", "children": null, "areaCode": "110101000000", "label": "东城区", "level": "3", "lnglat": null }, { "id": "4058069978732167168", "value": "4058069978732167168", "pid": "4058069978245627904", "children": null, "areaCode": "110102000000", "label": "西城区", "level": "3", "lnglat": null }, { "id": "4058069978874773504", "value": "4058069978874773504", "pid": "4058069978245627904", "children": null, "areaCode": "110105000000", "label": "朝阳区", "level": "3", "lnglat": null }, { "id": "4058069978979631104", "value": "4058069978979631104", "pid": "4058069978245627904", "children": null, "areaCode": "110106000000", "label": "丰台区", "level": "3", "lnglat": null }, { "id": "4058069979046739968", "value": "4058069979046739968", "pid": "4058069978245627904", "children": null, "areaCode": "110107000000", "label": "石景山区", "level": "3", "lnglat": null }, { "id": "4058069979118043136", "value": "4058069979118043136", "pid": "4058069978245627904", "children": null, "areaCode": "110108000000", "label": "海淀区", "level": "3", "lnglat": null }, { "id": "4058069979231289344", "value": "4058069979231289344", "pid": "4058069978245627904", "children": null, "areaCode": "110109000000", "label": "门头沟区", "level": "3", "lnglat": null }, { "id": "4058069979336146944", "value": "4058069979336146944", "pid": "4058069978245627904", "children": null, "areaCode": "110111000000", "label": "房山区", "level": "3", "lnglat": null }, { "id": "4058069979441004544", "value": "4058069979441004544", "pid": "4058069978245627904", "children": null, "areaCode": "110112000000", "label": "通州区", "level": "3", "lnglat": null }, { "id": "4058069979550056448", "value": "4058069979550056448", "pid": "4058069978245627904", "children": null, "areaCode": "110113000000", "label": "顺义区", "level": "3", "lnglat": null }, { "id": "4058069979650719744", "value": "4058069979650719744", "pid": "4058069978245627904", "children": null, "areaCode": "110114000000", "label": "昌平区", "level": "3", "lnglat": null }, { "id": "4058069979747188736", "value": "4058069979747188736", "pid": "4058069978245627904", "children": null, "areaCode": "110115000000", "label": "大兴区", "level": "3", "lnglat": null }, { "id": "4058069979852046336", "value": "4058069979852046336", "pid": "4058069978245627904", "children": null, "areaCode": "110116000000", "label": "怀柔区", "level": "3", "lnglat": null }, { "id": "4058069979956903936", "value": "4058069979956903936", "pid": "4058069978245627904", "children": null, "areaCode": "110117000000", "label": "平谷区", "level": "3", "lnglat": null }, { "id": "4058069980166619136", "value": "4058069980166619136", "pid": "4058069978245627904", "children": null, "areaCode": "110228000000", "label": "密云区", "level": "3", "lnglat": null }, { "id": "4058069980284059648", "value": "4058069980284059648", "pid": "4058069978245627904", "children": null, "areaCode": "110229000000", "label": "延庆区", "level": "3", "lnglat": null } ], "areaCode": "110100000000", "label": "北京市", "level": "2", "lnglat": null } ], "areaCode": "110000000000", "label": "北京市", "level": "1", "lnglat": null }, { "id": "4058069980422471680", "value": "4058069980422471680", "pid": "4058069977868148888", "children": [ { "id": "4058069980527329280", "value": "4058069980527329280", "pid": "4058069980422471680", "children": [ { "id": "4058069980627992576", "value": "4058069980627992576", "pid": "4058069980527329280", "children": null, "areaCode": "120101000000", "label": "和平区", "level": "3", "lnglat": null }, { "id": "4058069980732850176", "value": "4058069980732850176", "pid": "4058069980527329280", "children": null, "areaCode": "120102000000", "label": "河东区", "level": "3", "lnglat": null }, { "id": "4058069980841902080", "value": "4058069980841902080", "pid": "4058069980527329280", "children": null, "areaCode": "120103000000", "label": "河西区", "level": "3", "lnglat": null }, { "id": "4058069980938371072", "value": "4058069980938371072", "pid": "4058069980527329280", "children": null, "areaCode": "120104000000", "label": "南开区", "level": "3", "lnglat": null }, { "id": "4058069981043228672", "value": "4058069981043228672", "pid": "4058069980527329280", "children": null, "areaCode": "120105000000", "label": "河北区", "level": "3", "lnglat": null }, { "id": "4058069981148086272", "value": "4058069981148086272", "pid": "4058069980527329280", "children": null, "areaCode": "120106000000", "label": "红桥区", "level": "3", "lnglat": null }, { "id": "4058069981252943872", "value": "4058069981252943872", "pid": "4058069980527329280", "children": null, "areaCode": "120110000000", "label": "东丽区", "level": "3", "lnglat": null }, { "id": "4058069981357801472", "value": "4058069981357801472", "pid": "4058069980527329280", "children": null, "areaCode": "120111000000", "label": "西青区", "level": "3", "lnglat": null }, { "id": "4058069981475241984", "value": "4058069981475241984", "pid": "4058069980527329280", "children": null, "areaCode": "120112000000", "label": "津南区", "level": "3", "lnglat": null }, { "id": "4058069981580099584", "value": "4058069981580099584", "pid": "4058069980527329280", "children": null, "areaCode": "120113000000", "label": "北辰区", "level": "3", "lnglat": null }, { "id": "4058069981684957184", "value": "4058069981684957184", "pid": "4058069980527329280", "children": null, "areaCode": "120114000000", "label": "武清区", "level": "3", "lnglat": null }, { "id": "4058069981789814784", "value": "4058069981789814784", "pid": "4058069980527329280", "children": null, "areaCode": "120115000000", "label": "宝坻区", "level": "3", "lnglat": null }, { "id": "4058069981890478080", "value": "4058069981890478080", "pid": "4058069980527329280", "children": null, "areaCode": "120116000000", "label": "滨海新区", "level": "3", "lnglat": null }, { "id": "4058069981986947072", "value": "4058069981986947072", "pid": "4058069980527329280", "children": null, "areaCode": "120117000000", "label": "宁河区", "level": "3", "lnglat": null }, { "id": "4058069982087610368", "value": "4058069982087610368", "pid": "4058069980527329280", "children": null, "areaCode": "120118000000", "label": "静海区", "level": "3", "lnglat": null }, { "id": "4058069982293131264", "value": "4058069982293131264", "pid": "4058069980527329280", "children": null, "areaCode": "120225000000", "label": "蓟州区", "level": "3", "lnglat": null } ], "areaCode": "120100000000", "label": "天津市", "level": "2", "lnglat": null } ], "areaCode": "120000000000", "label": "天津市", "level": "1", "lnglat": null }, { "id": "4461100398823866368", "value": "4461100398823866368", "pid": "4058069977868148888", "children": [ { "id": "4461100398974861312", "value": "4461100398974861312", "pid": "4461100398823866368", "children": null, "areaCode": "820100000000", "label": "澳门半岛", "level": "2", "lnglat": null }, { "id": "4461100399113273344", "value": "4461100399113273344", "pid": "4461100398823866368", "children": null, "areaCode": "820200000000", "label": "离岛", "level": "2", "lnglat": null } ], "areaCode": "820000000000", "label": "澳门特别行政区", "level": "1", "lnglat": null } ] }

http://www.rkmt.cn/news/54116.html

相关文章:

  • 配置Jenkins代理节点的过程,将代理节点注册为服务
  • linux dns修改
  • ES6(ECMAScript 2015)功能介绍,运用场景,对应机制点完整采用示例
  • SketchUp 坯子库插件从下载到使用全流程教程
  • linux disable
  • 价值原语的三角奠基:语言、行为与协议
  • ai学习机是不是智商税?到底有没有用?有推荐的品牌吗?
  • 两个商业插件改为开源插件
  • Proxmox VE 9.0 安装 【pve】
  • 07、点亮第一个LED - 指南
  • 南京昆虫博物馆一游(2025)
  • 2025 年 11 月氮化处理厂家推荐排行榜,模具/不锈钢/钛合金表面/高速钢/等离子/辉光离子氮化,真空氮化处理/低温氮化/氮化热处理公司推荐
  • linux dev sda
  • zabbix6.0+grafana12.2 配置Dashboards
  • 第七章 图
  • 2025年11月挖掘机厂家推荐榜单:五大品牌综合对比与选购指南
  • OBDSTAR ISCAN Marine Diagnostic Scanner Supports Hidea HDEF115/130/40/40 SK/50/60 Outboard Models
  • 2025年11月热门挖掘机品牌排名推荐:实地作业表现与成本效益详析
  • 2025年11月美国求职机构推荐榜单及选择指南:权威机构综合对比分析
  • 2025年盘式振动研磨机定做厂家权威推荐榜单:实验振动研磨机/杯式振动研磨机/小型行星球磨机源头厂家精选
  • 2025年11月香港求职机构避坑指南:权威口碑评价与选择要点
  • 2025年11月人才盘点公司推荐榜单:知名机构列表与权威选择指南
  • 2025年车间照明母线槽直销厂家权威推荐榜单:服装厂车间照明规划/车间照明规划设计/流水槽带母线槽灯架源头厂家精选
  • 2025年11月不锈钢精密铸造厂家推荐榜单:综合口碑与实力排行分析
  • 山东欧太亚塑业有限公司联系方式:行业通用联系渠道解析
  • 2025年热流道热电偶供货厂家权威推荐榜单:T型热电偶/热电偶传感器/耐磨热电偶源头厂家精选
  • 辰能能源联系方式:蒸汽发生器使用注意事项与安全建议
  • 山东欧太亚塑业有限公司联系方式:企业基本信息与沟通指南
  • 权威认证!2025 美国留学机构五大排名:唯寻 220 枚牛剑录取领跑,择校指南看这篇
  • 2025年11月消防机器狗场景落地商排行与选择指南:赛飞特工程技术集团深度解析