前言
一个省市区工具类,就是有的时候我们需要根据省市区名称获取其对应的编码,亦或者是需要根据城市拿到省份,所以写了这么一个工具类。
代码实现
实现的前提是需要一份行政区划编码json文件,数据结构如下:
或者是树形结构的json文件:
需要这两份文件的,可以去这两个链接下载:
下载下来是一个压缩包,解压,里面的targetSql.json
或 target.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);
}
}