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日

相关文章

  • 详解重试框架Spring retry实践

    详解重试框架Spring Retry实践 Spring Retry是一个用于在Spring应用程序中执行重试逻辑的框架。它提供了很多有用的功能,例如定时重试、重试策略的配置、异常处理等。在这篇文章中,我们将为您介绍Spring Retry的基本概念和使用方法,并提供一些示例来帮助您更好地了解Spring Retry的使用。 引入Spring Retry 在使…

    Java 2023年5月19日
    00
  • java字符串的重要使用方法以及实例

    下面是关于Java字符串的重要使用方法以及实例的完整攻略。 什么是Java字符串? Java字符串是一种保存一系列字符的对象,是Java中最常用的数据类型之一。在Java中,字符串是不可变的,因此每个对字符串的操作都会产生一个新的字符串对象。字符串作为Java编程中的重要部分,我们需要了解一些重要的使用方法。 Java字符串的声明 在Java中,字符串的声明…

    Java 2023年5月26日
    00
  • java框架之maven是用来做什么的

    Maven是一种Java项目管理工具,它提供了自动化构建、版本控制、项目报告和依赖管理的功能。它使用一个基于XML的格式来描述项目构建和依赖关系。 什么是Maven Maven是一个开源的工具,提供构建、测试、部署Java应用程序所需的一系列自动化工具。它采用“约定优于配置”的设计理念,通过定义标准的目录结构和构建过程规则,将工程构建自动化,提高项目的开发效…

    Java 2023年5月20日
    00
  • Java后台基于POST获取JSON格式数据

    Java后台基于POST获取JSON格式数据的完整攻略分为以下几个步骤: 1. 发送POST请求 在Java后台中,发送POST请求通常使用HttpURLConnection类,其代码示例如下: URL url = new URL("http://example.com/api"); HttpURLConnection con = (Ht…

    Java 2023年5月26日
    00
  • Spring下Filter过滤器配置全局异常处理的详细步骤

    首先让我们来了解一下Filter和全局异常处理的概念: Filter是Web应用中的过滤器,用于对请求进行过滤和处理,可以在处理请求之前和之后进行一些额外的处理或者过滤,同时也可优化代码性能、保护系统安全、统一处理日志等。 全局异常处理是指处理在应用程序中未被捕获的所有异常,避免应用程序因为未捕获异常而崩溃或者无法继续正常工作。 因此,我们可以结合Filte…

    Java 2023年5月27日
    00
  • Java NegativeArraySizeException异常解决方案

    我将为您讲解解决“Java NegativeArraySizeException异常”的完整攻略。 什么是NegativeArraySizeException异常? 首先,我们需要了解一下NegativeArraySizeException异常。它是Java中的一种运行时异常,当我们使用负数作为数组大小时,就会抛出这个异常。 解决方案 要解决Negative…

    Java 2023年5月27日
    00
  • javax NotBlank和Email注解失效的解决

    首先,解释一下什么是javax的NotBlank和Email注解。它们是Java平台标准的校验注解,NotBlank用于校验String类型的字段不为空或空格,Email用于校验String类型的字段符合Email格式。但是,有时候我们在使用这些注解进行校验时,可能会出现失效的情况,接下来我将介绍一些可能导致这种情况的原因以及解决方法。 原因和解决方法1:未…

    Java 2023年5月20日
    00
  • 浅析MMAP零拷贝在RocketMQ中的运用

    浅析MMAP零拷贝在RocketMQ中的运用攻略 什么是MMAP MMAP(Memory Mapped Files)是指通过映射虚拟内存的方式来访问硬盘上的文件。在Linux系统中,使用mmap()函数可以将一个文件映射到进程的地址空间中,从而使得该文件变得像是一个内存块一样可以被直接访问。通过MMAP技术,可以实现一些高效的I/O操作,特别是在大数据量传输…

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