【Java工具类】根据省市区县名称获取对应的行政编码、根据区县获取城市、根据城市获取省份

前言

一个省市区工具类,就是有的时候我们需要根据省市区名称获取其对应的编码,亦或者是需要根据城市拿到省份,所以写了这么一个工具类。

代码实现

实现的前提是需要一份行政区划编码json文件,数据结构如下:

在这里插入图片描述

或者是树形结构的json文件:

在这里插入图片描述

需要这两份文件的,可以去这两个链接下载:

链接: 网盘下载 提取码: 5rp2
链接: csdn下载

下载下来是一个压缩包,解压,里面的targetSql.jsontarget.json 就是这篇文章要用到的文件,其它几个文件可以参考我以前的 这篇文章

这两份文件,看自己的具体需求用哪一份,如果项目中没有用到树形结构的话,用 targetSql.json 即可;如果除了这篇文章里写到的需求,还有其它需求且用到了树形结构的话,就用 target.json

下面的代码两份文件的实现代码都写了,选其中一份文件,把另一份文件的相关代码注释掉即可。

下面是具体的实现代码:

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import lombok.Data;

import java.io.File;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.*;

/**
 * 省市区工具类
 */
public class CityUtil {

	public static List<SysCity> list = new ArrayList<>();
    //public static List<SysCity> treeList = new ArrayList<>();
    //public static Map<String, SysCity> mapList = new HashMap<>();

    @Data
    public static class SysCity{
        private String id;
        private String pid;
        private String name;
        private String code;
        private String intactCode;
        private Integer level;
        public List<SysCity> children = new ArrayList<>();
    }

    static {
    	// targetSql.json、target.json 文件放进 resources 文件夹下
        //URL resource = CityUtil.class.getClassLoader().getResource("target.json");
        URL resource = CityUtil.class.getClassLoader().getResource("targetSql.json");
        File file = new File(resource.getPath());
        //System.out.println("行政区划编码文件路径========>>>" + file.getAbsolutePath());
        JSONArray array = JSONUtil.readJSONArray(file, Charset.defaultCharset());
        list.addAll(JSONUtil.toList(array, SysCity.class));
        // 如果用的是target.json文件,需要将树形结构里面的子级全部拿出来放到list中
        /*treeList.addAll(JSONUtil.toList(array, SysCity.class));
        //mapList = treeList.stream().collect(Collectors.toMap(SysCity::getIntactCode, Function.identity(), (key1, key2) -> key2));
        list.addAll(treeList);
        for (SysCity city : treeList) {
            List<SysCity> children = city.getChildren();
            list.addAll(children);
            for (SysCity c : children) {
                list.addAll(c.getChildren());
            }
        }*/
    }

    public static void main(String[] args) {
        System.out.println(getProvinceCodeByName("江西省"));
        System.out.println(getProvinceNameByCode("110000"));
        System.out.println(getCityCodeByName("惠州市"));
        System.out.println(getCityNameByCode("441300"));
        System.out.println(getDistrictCodeByName("惠城区"));
        System.out.println(getDistrictNameByCode("441302"));
        System.out.println(getProvinceNameByCityName("惠州市"));
        System.out.println(getCityNameByDistrictName("惠城区"));
    }

    /**
     * 根据名称获取编码
     */
    public static String getCodeByName(int level,String name) {
        return list.stream()
                .filter(city -> city.getLevel() == level && city.getName().equals(name))
                .findFirst()
                .map(SysCity::getIntactCode)
                .orElse(null);
    }

    /**
     * 根据编码获取名称
     */
    public static String getNameByCode(int level,String code) {
        return list.stream()
                .filter(city -> city.getLevel() == level && city.getIntactCode().equals(code))
                .findFirst()
                .map(SysCity::getName)
                .orElse(null);
    }

    /**
     * 根据名称获取上级名称
     */
    public static String getParentNameByName(int level,String name) {
        String pid = list.stream()
                .filter(city -> city.getLevel() == level && city.getName().equals(name))
                .findFirst()
                .map(SysCity::getPid)
                .orElse(null);
        return list.stream()
                .filter(city -> city.getId().equals(pid))
                .findFirst()
                .map(SysCity::getName)
                .orElse(null);
    }

    /**
     * 根据省份名称获取省份编码
     */
    public static String getProvinceCodeByName(String provinceName) {
        return getCodeByName(1,provinceName);
    }

    /**
     * 根据省份编码获取省份名称
     */
    public static String getProvinceNameByCode(String provinceCode) {
        return getNameByCode(1,provinceCode);
    }

    /**
     * 根据城市名称获取城市编码
     */
    public static String getCityCodeByName(String cityName) {
        return getCodeByName(2,cityName);
    }

    /**
     * 根据城市编码获取城市名称
     */
    public static String getCityNameByCode(String cityCode) {
        return getNameByCode(2,cityCode);
    }

    /**
     * 根据区县名称获取区县编码
     */
    public static String getDistrictCodeByName(String districtName) {
        return getCodeByName(3,districtName);
    }

    /**
     * 根据区县编码获取区县名称
     */
    public static String getDistrictNameByCode(String districtCode) {
        return getNameByCode(3,districtCode);
    }

    /**
     * 根据城市名称获取省份名称
     */
    public static String getProvinceNameByCityName(String cityName) {
        return getParentNameByName(2,cityName);
    }

    /**
     * 根据区县名称获取城市名称
     */
    public static String getCityNameByDistrictName(String districtName) {
        return getParentNameByName(3,districtName);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

符华-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值