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=临湘市}

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

阅读剩余 60%

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

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

相关文章

  • Struts2学习笔记(9)-Result配置全局结果集

    首先我们需要了解什么是Struts2的Result配置。 在Struts2中,Result是将Action执行后返回的结果封装成一个对象,通常包含视图名称、视图类型和一些其它相关的信息。通过配置Result,我们可以指定如何处理Action执行后返回的结果,例如将结果转发到某个JSP或者跳转到某个URL等。 全局结果集是一种在Struts2中配置全局Resu…

    Java 2023年5月20日
    00
  • Java封装数组之改进为泛型数组操作详解

    Java封装数组之改进为泛型数组操作详解 在Java程序开发中,经常会使用数组来存储和处理数据,但是传统的数组存储方式存在类型不安全、代码冗长等问题,为了解决这些问题,Java提供了泛型数组,即封装数组。本文将详细介绍Java封装数组的概念,封装原理以及如何改进为泛型数组的操作步骤和技巧。 一、概念 Java封装数组是指在类中定义数组变量,封装了数组的属性和…

    Java 2023年5月26日
    00
  • 使用Maven搭建Hadoop开发环境

    下面我将介绍如何使用Maven搭建一个Hadoop开发环境: 1. 简介 Maven是一个Java项目管理工具,用于项目构建、依赖管理和项目信息维护。在Hadoop项目中,Maven能够方便地添加和管理Hadoop相关的依赖项,例如Hadoop Client API、Hadoop HDFS API、YARN API和MapReduce API。因此,使用Ma…

    Java 2023年5月20日
    00
  • java实现字符串和日期类型相互转换的方法

    Java实现字符串和日期类型相互转换的方法,可以利用Java内置的SimpleDateFormat类,通过指定的格式进行转换。 步骤一:定义日期格式 首先需要定义日期格式,日期格式指示了SimpleDateFormat类如何将字符串解析为日期对象或将日期对象格式化为字符串。以下是Java中日期格式化字符串的常用符号: yyyy – 年份,如2021 MM -…

    Java 2023年5月20日
    00
  • Hibernate实现悲观锁和乐观锁代码介绍

    关于Hibernate实现悲观锁和乐观锁的代码介绍,我们可以分别针对不同的锁机制进行讲解。 一、悲观锁 悲观锁机制在操作数据的时候会先将数据锁定,避免其他线程对该数据的访问和修改。Hibernate提供了两种方式实现悲观锁:使用数据库相关功能实现和使用Hibernate API实现。 1.使用数据库相关功能实现悲观锁 需要在sql语句中使用 for upda…

    Java 2023年5月20日
    00
  • Java MyBatis框架环境搭建详解

    关于”Java MyBatis框架环境搭建详解”,我将为您提供以下攻略: 环境准备 Java环境准备:本地安装JDK; 数据库环境准备:本地安装MySQL数据库; IDE环境准备:推荐使用IntelliJ IDEA进行项目开发,如果没有安装可以在官网下载并安装。 项目搭建 使用Maven创建项目:在IDE中创建项目,选择Maven项目,并选择MyBatis框…

    Java 2023年5月20日
    00
  • SpringBoot整合Spring Data Elasticsearch的过程详解

    下面我将为您详细讲解Spring Boot整合Spring Data Elasticsearch的完整攻略,其中包括以下步骤: 引入依赖 配置Elasticsearch 创建数据实体类 创建Elasticsearch Repository 使用Repository进行数据操作 示例1:添加数据到Elasticsearch中 示例2:从Elasticsearc…

    Java 2023年5月20日
    00
  • Java9新特性Module模块化编程示例演绎

    Java9新特性Module模块化编程示例演绎攻略 什么是模块化编程 在Java9之前,我们编写的Java应用程序都是基于jar包的。当我们开发大型应用时,常常面临着依赖管理不可控、类冲突等问题。而Java9引入了一种新的编程方式——模块化编程。在模块化编程中,我们可以将应用程序拆分成多个独立的模块,并对每个模块进行依赖管理。这种方式能够让应用程序更加灵活、…

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