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

国家行政区划编码格式化和树形结构转换示例

一、需求描述

国家行政区划编码树形结构是一种用于组织和表示国家内部各级行政区划的层次结构。这种结构不仅有助于数据的分类和存储,还能提高地理信息系统的效率,便于各级政府和机构进行数据管理和统计分析。项目内需要自行维护一套行政区划数据,支持高德地图定位获取到的行政机构编码进行数据映射。国家行政区划编码的可以通过民政部官方网站获取:2023版国家县级及以上行政区划编码目的地址。官方的行政区划编码数据是按记录行提供的,没有父子级关系绑定信息、数据记录行本身没有层级信息、数据记录行没有行政区划全称。因此,需要对该数据进行重新处理后才能在项目内方便的进行使用,具体处理过程即相关代码参照如下。

二、树形机构转换依赖模型

  • TreeNode

节点数据模型,提供了基础树形结构构建所必须的属性(主要是父子级对应关系)获取相关方法,提供了符合父子级关系特征的数据行转换为树形结构的方法,比如将数据行集合转换为树的方法、树形结构数据的展开为数据行等基础树操作。代码如下:

package org.jeecg.common.entity;

import org.apache.commons.collections4.CollectionUtils;

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

/**
 * @className: Node
 * @author: Liuyh
 * @date: 2024/10/16 13:32
 * @Version: 1.0
 * @description:
 */
public interface TreeNode<T> {

    /**
     * 获取当前节点id
     *
     * @return
     */
    String currentId();

    /**
     * 获取节点的父节点id
     *
     * @return
     */
    String getParentId();

    /**
     * 设置节点的层级
     *
     * @param level
     */
    void setNodeLevel(Integer level);

    /**
     * 获取节点的所有子节点
     *
     * @return
     */
    List<T> getChildren();


    /**
     * 构建多棵树形结构
     *
     * @param rootIds {@literal Root ids}
     * @param nodes   {@literal All nodes}
     * @param <T>
     * @return
     */
    static <T extends TreeNode<T>> List<T> buildTree(List<String> rootIds, List<T> nodes) {
        Map<String, List<T>> nodeMap = nodes.stream().collect(Collectors.groupingBy(o -> o.getParentId()));
        // 找到所有的根节点
        List<T> rootNodes =
                nodes.stream().filter(node -> rootIds.contains(node.currentId())).collect(Collectors.toList());

        // 构建树形结构
        rootNodes.forEach(root -> buildChildren(root, nodeMap, 0));
        return rootNodes;
    }

    /**
     * 构建一棵树形结构
     * <b>根节点{@linkplain #getParentId()}为空或者null</b>
     *
     * @param nodes      {@literal All nodes}
     * @param firstLevel {@literal firest Level of root node}
     * @param <T>
     * @return
     */
    static <T extends TreeNode<T>> List<T> buildTree(List<T> nodes, int firstLevel) {
        Map<String, List<T>> nodeMap = nodes.stream().collect(Collectors.groupingBy(o -> o.getParentId()));
        // 找到所有的根节点
        List<T> rootNodes = CollectionUtils.isEmpty(nodeMap.get(null)) ? nodeMap.get("") : nodeMap.get(null);
        // 构建树形结构
        rootNodes.forEach(root -> buildChildren(root, nodeMap, firstLevel));
        return rootNodes;
    }

    /**
     * 构建一棵树形结构
     *
     * @param rootNode {@literal Root node}
     * @param nodeMap  {@literal Map of nodes group by parent id}
     * @param level    {@literal Level of current node}
     * @param <T>
     */
    static <T extends TreeNode<T>> void buildChildren(T rootNode, Map<String, List<T>> nodeMap, int level) {
        // 设置当前节点的层级
        rootNode.setNodeLevel(level);
        // 找到当前节点的所有子节点
        List<T> children = nodeMap.get(rootNode.currentId());
        if (children != null && !children.isEmpty()) {
            // 将子节点添加到当前节点的 children 列表中

http://www.kler.cn/news/362623.html

相关文章:

  • [项目][boost搜索引擎#4] cpp-httplib使用 | log.hpp | 前端 | 测试及总结
  • 构建基于Spring Boot的现代论坛平台
  • 在linux上安装r-base和rpy2到conda环境
  • Excel常用操作培训
  • 数字后端实现静态时序分析STA Timing Signoff之min period violation
  • 通过Python爬虫获取商品销量数据,轻松掌握市场动态
  • fluent-ffmpeg操作MP3文件深入解析
  • 如何使用 Maven 不同环境使用不同资源文件 提升项目安全性
  • Windows 10、Office 2016/2019 和 PPTP 和 L2TP协议即将退役,企业应尽早做好准备
  • JAVA开发环境:IntelliJ IDEA、Java JDK、Maven 安装配置
  • 网易面试:请设计一个高可用性的软件架构,说明设计思路
  • 分布式链路追踪-01初步认识SkyWalking
  • win10下用vscode和pycharm运行odoo18的速度对比
  • Xcode16 编译运行YYCache iOS18 sqlite3_finalize 闪退问题解决方案
  • Arduino-ESP32机器人控制器设计练习题汇总
  • 一款好用的搜索软件——everthing(搜索比文件资源管理器快)
  • gin入门教程(3):创建第一个 HTTP 服务器
  • 自定义表单小程序系统源码 报名表单+付费表单+预约表单三合一 带源代码包以及搭建部署教程
  • windows复制文件到U盘,ubuntu打开U盘中文显示?
  • 嵌入式硬件设计:技术与实践
  • GESP CCF python四级编程等级考试认证真题 2024年9月
  • 一文彻底搞透Redis的数据类型及具体的应用场景
  • 半监督学习----西瓜书机器学习笔记及理解(五)
  • python作业02.
  • R数据科学 17.3.3答案
  • 【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (二):项目文件夹架构及路由的设置