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日

相关文章

  • AJAX SpringBoot 前后端数据交互的项目实现

    讲解”AJAX SpringBoot前后端数据交互的项目实现”的步骤及示例: 1. 准备工作 首先,需要搭建好Spring Boot的环境,并在其中添加对thymeleaf和web模块的支持。若需要使用ORM,还需要添加对JPA的支持。 在前端部分,需要准备好HTML、CSS和JS等组件。 2. 建立一个Spring Boot项目 使用Spring Init…

    Java 2023年5月20日
    00
  • 如何使用Java缓存框架?

    使用Java缓存框架可以有效地提高系统的性能和响应速度。下面将对如何使用Java缓存框架进行详细讲解。 什么是Java缓存框架 Java缓存框架是一个用于在内存中缓存数据的工具。它可以有效地提高系统的性能和响应速度。Java缓存框架最常用的实现方式是基于内存的缓存,使用Java缓存框架可以将数据在内存中保存一段时间,从而减少系统对数据库的访问。 常见的Jav…

    Java 2023年5月11日
    00
  • ibatis迁移到mybatis3的注意事项

    下面是ibatis迁移到mybatis3的注意事项的完整攻略: 1. 概览 iBATIS作为一个成熟的ORM框架,已经成为本质上与 MyBatis 这个极受欢迎的 ORM 框架的母版。iBATIS 的成功导致了 MyBatis 的产生,MyBatis 与 iBATIS 必然有很多相似之处,包括映射文件、参数映射、参数验证等等。iBATIS 迁移到 MyBat…

    Java 2023年5月20日
    00
  • Java无法输出中文问题及解决

    Java无法输出中文问题是因为在输出时使用的是字节流,而中文字符在UTF-8编码下占用多个字节,单独输出一个字节可能无法正确显示中文字符。下面是Java无法输出中文问题的解决步骤。 方法一:使用字符流 使用BufferedWriter类在控制台(System.out)输出中文字符。 import java.io.*; public class OutputC…

    Java 2023年5月20日
    00
  • 一分钟掌握Java Quartz定时任务

    一分钟掌握Java Quartz定时任务攻略 Java Quartz是一款轻量级的定时任务调度框架,它的使用非常简单,可以让开发者快速地实现定时任务调度。 Quartz的入门 在使用Quartz之前,需要先将Quartz的jar包导入到项目中。这里我们使用Maven进行依赖管理,只需要在pom.xml文件中增加如下依赖: <dependency>…

    Java 2023年5月20日
    00
  • 常见的Java类加载器有哪些?

    我来为你详细讲解一下Java类加载器。 Java类加载器 在Java中,类加载器是用于加载Java类和资源的特殊Java类。Java虚拟机通过它们来动态地加载Java类。Java类加载器是Java技术的核心组成部分,因为它使 Java 的动态实现成为可能。 Java 类加载器是类 Java.lang.ClassLoader 的实例,它负责将类的字节码从文件系…

    Java 2023年5月11日
    00
  • Spring Data JPA框架快速入门之自定义Repository接口

    下面是关于“Spring Data JPA框架快速入门之自定义Repository接口”的详细讲解。 什么是Spring Data JPA? Spring Data JPA是Spring提供的一个用于简化JPA开发的框架,它提供了一种使得JPA的使用更加方便快捷的方式,使我们能够以更少的代码量实现JPA数据存储相关的操作。 自定义Repository接口 自…

    Java 2023年6月3日
    00
  • 详解Java中的八种单例创建方式

    下面我来详细讲解Java中的八种单例创建方式的完整攻略。 标题 一、单例模式概述 单例模式是设计模式中常见的一种,用于保证一个类仅有一个实例,并提供一个全局的访问点进行访问。 二、Java中八种单例创建方式 1. 饿汉式 饿汉式是最基本的实现方式,它在类加载的时候就创建了对象实例。 public class Singleton { private stati…

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