当前位置: 首页 > 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<T> 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<T> children;
}

 使用范例

返回树状结构的地区数据

1)首先构建数据VO

@EqualsAndHashCode(callSuper = true)
@Data
public class AreaVO extends BaseNode<AreaVO> {private static final long serialVersionUID = 1L;private String areaCode;private String label;private String level;private String lnglat;}

2)查询地区数据

List<Area> list = areaService.list();

3) 构建数据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());

4) 使用工具类构造数据结构

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": "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": "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": "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": "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}],"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/44607/

相关文章:

  • 汽车行业PPM统计乱象
  • 熵、交叉熵、KL散度
  • Studio 3T 2025.21 发布 - MongoDB 的终极 GUI、IDE 和 客户端
  • 2025年长沙心理咨询机构专家团队排名,在线/线上心理咨询公司排行
  • SLS 脱敏函数实践:智能化与数据安全的融合
  • .net 行不行?在线客服系统成功支持客户双11大促,21客服在线,高峰超300会话并发
  • 手机WebView启用硬件GPU加速 - jerry
  • Cisco Secure Email and Web Manager Virtual 16.0.2 MD - 集中管理思科安全设备
  • PVE9安装R8125 2.5G网卡驱动、开启缓冲区、开启硬件多队列支持(基于联想来酷MiniPro)
  • 单部电梯调度程序
  • 2025年吨包醋酸钠定制厂家权威推荐榜单:‌工业级乙酸钠/醋酸钠乙酸钠/醋酸钠乙酸钠源头厂家精选
  • 完整教程:解读ASME BPVC.II.A-2023
  • linux doxygen
  • 2025 最新钢管设备厂家权威推荐榜:3PE 防腐 / 抛丸除锈 / 涂塑喷粉设备综合测评重磅发布内壁抛丸除锈设备/涂塑设备,防腐设备,粉末喷涂设备,内外壁喷粉设备,抛丸除锈设备公司推荐
  • 2025 最新管道设备供应厂家口碑推荐榜:聚焦 3PE / 除锈 / 涂塑设备,精选品牌权威测评推荐管道除锈设备/管道涂塑设备/管道内壁喷粉设备/管道涂塑设备公司推荐
  • 2025年人参皂苷化学对照品源头厂家权威推荐榜单:维生素K2化学对照品/蜕皮激素化学对照品/麦角甾醇化学对照品源头厂家精选
  • CODE1:GPIO输出和输入 - LI,Yi
  • 生成ppt图片的网站
  • Teamcenter 导入 mpp创建时间表 - 张永全
  • 2025年百叶窗厂家推荐排行榜前十名:智能窗帘电机选购全指南
  • Hi3403开发板极速启航 | 手把手带你玩转核心例程,轻松上手AI视觉!
  • 等成绩的日子
  • 2025年国内百叶窗厂家综合实力排行榜:技术领先与品牌价值深度解析
  • 2025年出口塔吉克斯坦稳压器实力厂家权威推荐榜单:出口吉尔吉斯斯坦稳压器/三相380V稳压器/出口土库曼斯坦稳压器源头厂家精选
  • DEV1:LED - LI,Yi
  • 2025年警用指挥车供货厂家权威推荐榜单:越野应急指挥车/全顺无人机指挥车/双拓展指挥车源头厂家精选
  • NetworkManager接管vxlan网卡等导致容器网络不通
  • 2025年国内百叶窗企业权威推荐排行榜
  • 联想小新pad 2025刷机包下载(TB335FC刷机包)
  • 2025年百叶窗厂家专业推荐榜单:行业权威排行解析