java如何从地址串中解析提取省市区(完美匹配中国所有地址)

下面是Java如何从地址串中解析提取省市区的攻略:

一、准备工作

  1. 导入相关工具包。这里我们会用到commons-csvcommons-lang3这两个工具包。可以用Maven或Gradle自动化地导入。

  2. 下载地址库。可以从国家统计局官网下载最新的地址数据库,也可以从GitHub上下载已经格式化好的CSV格式地址库。

  3. 将地址库导入内存中的Hash表中,便于地址的快速查找和匹配。

二、详细步骤

下面详细介绍从地址串中提取省市区的Java代码实现过程:

  1. 引入相关工具包:
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import org.apache.commons.lang3.StringUtils;
  1. 定义一个Hash表,将地址库导入内存:
// 声明Map对象,key为地址编码,value为地址名称
private Map<String, String> addressMap = new HashMap<>();

// 将地址编码和名称的映射关系导入内存中的Map中
public void loadAddress() throws Exception {
    // 读取CSV格式的地址库数据
    Reader reader = new InputStreamReader(this.getClass().getResourceAsStream("/china_address.csv"), "UTF-8");
    CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT.withFirstRecordAsHeader().withIgnoreHeaderCase().withTrim());
    for (CSVRecord csvRecord : csvParser) {
        String code = csvRecord.get("编码");
        String name = csvRecord.get("名称");
        addressMap.put(code, name);
    }
}
  1. 实现解析地址的方法:
/**
 * 解析地址
 * @param address 地址串
 * @return 包含省市区的Map
 */
public Map<String, String> parseAddress(String address) throws Exception {
    Map<String, String> resultMap = new HashMap<>();

    // 对地址串进行处理,删除空格
    address = address.replaceAll("\\s*", "");

    // 进行省市区匹配
    for (int i = 6; i >= 2; i--) {
        String provinceCode = address.substring(0, i) + "0000";
        String provinceName = addressMap.get(provinceCode);
        if (provinceName == null) {
            continue;
        }

        int j = i + 2;
        String cityCode = address.substring(0, j) + "00";
        String cityName = null;
        if (StringUtils.equals(provinceName, "北京市") || StringUtils.equals(provinceName, "天津市") || StringUtils.equals(provinceName, "上海市") || StringUtils.equals(provinceName, "重庆市")) {
            cityName = provinceName;
        } else {
            cityName = addressMap.get(cityCode);
            if (cityName == null) {
                continue;
            }
        }

        String districtName = null;
        if (address.length() > j) {
            districtName = address.substring(j);
            if (StringUtils.equals(districtName, "县")) {
                String countyCode = cityCode.substring(0, 4) + "10";
                String countyName = addressMap.get(countyCode);
                if (StringUtils.isNotBlank(countyName)) {
                    districtName = countyName;
                }
            }
        }

        resultMap.put("province", provinceName);
        resultMap.put("city", cityName);
        resultMap.put("district", districtName);
        return resultMap;
    }

    // 没有匹配上,则返回空Map
    return resultMap;
}

在上面的代码中,我们首先将地址串中的空格删除,然后按照“省-市-区”的顺序进行匹配。注意,省、市的编码是可以直接从地址串中提取出来的,而区的名称需要通过匹配地址库来获得。如果匹配失败,则跳过该级,直到找到最高级的为止。

三、两条示例

下面给出两条示例:

  1. 示例地址:广东省深圳市南山区西丽街道科技中一路12号
Map<String, String> resultMap = parseAddress("广东省深圳市南山区西丽街道科技中一路12号");
System.out.println(resultMap);// 输出:{province=广东省, city=深圳市, district=南山区}
  1. 示例地址:湖南省岳阳市临湘市大塘乡陈家村
Map<String, String> resultMap = parseAddress("湖南省岳阳市临湘市大塘乡陈家村");
System.out.println(resultMap);// 输出:{province=湖南省, city=岳阳市, district=临湘市}

以上就是提取地址中的省市区的攻略和示例。希望可以对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java如何从地址串中解析提取省市区(完美匹配中国所有地址) - Python技术站

(1)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 如何创建线程?

    以下是关于如何创建线程的完整使用攻略: 如何创建线程? 在Java中,可以通过继承Thread类或实现Runnable接口来创建线程。以下是创建线程的步骤: 继承Thread类创建线程 创建一个继承自Thread类的子类,并重写run()方法。 java public class MyThread extends Thread { public void r…

    Java 2023年5月12日
    00
  • java获取当前时间的四种方法代码实例

    下面是完整的攻略。 介绍 在Java中,我们常常需要获取当前的时间,用于记录日志、统计应用程序的运行时长等等。本文将介绍四种获取当前时间的方法,并提供相应的代码实例。 方法一:使用System类的currentTimeMillis()方法获取当前时间 System类提供了一个静态的currentTimeMillis()方法,可以获取当前的毫秒数,从而计算出当…

    Java 2023年5月20日
    00
  • Java Servlet生成JSON格式数据并用jQuery显示的方法

    下面是 Java Servlet 生成 JSON 格式数据并用 jQuery 显示的方法的完整攻略。 什么是 JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于阅读和编写。 Servlet 生成 JSON 1. 添加依赖 首先需要添加一个 JSON 库,常用的有 Gson 和 FastJSON。这里…

    Java 2023年5月26日
    00
  • springboot 返回json格式数据时间格式配置方式

    下面是关于“springboot 返回json格式数据时间格式配置方式”的完整攻略。 一、需求分析 在Spring Boot应用中,我们常常需要返回JSON格式数据。而JSON格式中的时间字段经常需要进行格式化,以便更加直观和易读。因此,我们需要对返回的时间字段进行格式化处理。 二、解决方法 Spring Boot提供了多种方式来解决这个问题,下面将介绍两种…

    Java 2023年5月26日
    00
  • Java基础之反射详解

    Java基础之反射详解 简介 反射(Reflection)是Java语言的重要特性之一,可以在运行时获取一个类的构造方法、成员变量、方法等信息。反射使得Java编写的代码具有更强的灵活性和可扩展性。 反射的基本应用 获取Class对象 获取一个类的Class对象,可以使用以下三种方式: 调用类的静态变量class。 使用对象的getClass()方法。 使用…

    Java 2023年5月26日
    00
  • 解读maven配置阿里云镜像问题

    当使用 Maven 构建项目时,如果从默认的 Maven Central Repository服务器下载依赖包速度比较慢,可以使用阿里云镜像来加速下载。 以下是解读 Maven 配置阿里云镜像问题的步骤: 步骤一:打开Maven配置文件 首先找到 Maven 的配置文件 settings.xml,一般情况下该文件位于 ~/.m2/ 目录下。如果不存在该文件,…

    Java 2023年5月20日
    00
  • SpringBoot 整合Jest实例代码讲解

    让我们开始讲解“SpringBoot 整合Jest实例代码讲解”的完整攻略。 1. 简介 Jest是一个基于Java的全文搜索引擎库,具有快速、可扩展和易于使用的特点。而Spring Boot是目前非常流行的一款Java Web框架,其提供了开箱即用的特性,可以快速搭建Web应用程序。 在本文中,我们将介绍如何使用Spring Boot整合Jest,并提供两…

    Java 2023年5月26日
    00
  • SpringBoot如何使用自定义注解实现接口限流

    接下来我将详细讲解SpringBoot如何使用自定义注解实现接口限流。 一、什么是接口限流?为什么需要接口限流? 接口限流是应对高并发场景下保障系统稳定性的一种重要手段。一些接口请求过于频繁,可能会占用系统过多的资源,导致系统崩溃等问题。因此,我们需要对这些接口设置限流策略,对请求进行控制,而这种限流策略就是接口限流。 二、如何使用自定义注解实现接口限流? …

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部