当前位置: 首页 > 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.jsqmd.com/news/44562/

相关文章:

  • Topic
  • 2025年【口碑好的/比较好的/靠谱的】工业级/国产化/变电站/变电站/电力/机房/光伏/远动/发电厂/工业级/嵌入式机柜/通讯管理机【公司/工厂/厂家】推荐/排行榜 哪家好/强/靠谱
  • 配置Jenkins代理节点的过程,将代理节点注册为服务
  • linux dns修改
  • linux dns 服务器 搭建
  • linux dmesg
  • 实用指南:Vue2 与 Vue3 父子组件参数传递全解析:从实例到原理
  • ES6(ECMAScript 2015)功能介绍,运用场景,对应机制点完整采用示例
  • 11.19_刷题有感
  • web框架——flask-1
  • 2025 年 11 月自动裁床厂家推荐排行榜,服装自动裁床,皮革自动裁床,工业自动裁床,智能数控自动裁床公司精选
  • AI眼镜外包团队:Rokid Glasses默认接入了通义大模型
  • 双指针的“适用边界”:从直方图最大矩形错误,看透三大经典问题的本质差异
  • SketchUp 坯子库插件从下载到使用全流程教程
  • webrtc弱网-AcknowledgedBitrateEstimatorInterface类源码分析与算法原理 - 详解
  • 注意力富集与女性优势
  • linux disable
  • linux dia
  • linux dhcp服务器配置
  • 一文讲清,生产质量管理的10大核心指标及公式
  • CSharp_Winform控件学习_Winform 上加ToolStrip时图标大小调整
  • 完整教程:反爬克星还是效率神器?Browser-Use+cpolar重构Web自动化逻辑
  • 价值原语的三角奠基:语言、行为与协议
  • Qt5支持手柄
  • ai学习机是不是智商税?到底有没有用?有推荐的品牌吗?
  • 两个商业插件改为开源插件
  • Proxmox VE 9.0 安装 【pve】
  • 07、点亮第一个LED - 指南
  • oracle 查看定义语句
  • linux dhcp服务器的配置