最近新写了一个关于全世界国家、省会、城市地址解析的功能。
可用于,比如航班管理系统、高铁管理系统、快递系统、定位、一般的系统登录时地址选择等应用场景。
例如:查询全球有哪些国家、查询某个国家下有哪些城市或省会,查询某个省下有哪些城市
一、地址信息文件worldAddress.txt下载
worldAddress.txt 文件包含了全世界所有国家的省市。
百度云下载: https://pan.baidu.com/s/1HAU6NIsU3vrhMJFAqd33Ww(提取码:k5wx)
worldAddress.txt 文件长这样:
国家前没有空格,省会前2个空格,城市前4个空格。
二、解析地址信息文件代码
用到 fastjson 来返回json,需网上下载该jar包导入,
如果你的项目使用maven,你可以使用如下maven来导入fastjson依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.79</version>
</dependency>
上面下载的文件在下面的addressFilePath 配置路径。
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class WorldAddressUtils {
/**
* 用于读取解析的地址路径
*/
private final String addressFilePath = "F:/new/worldAddress.txt";
/**
* 是否过滤A、B、C...之类的国家分割符号,true过滤,false不过滤
*/
private final boolean fillterSingleChar = true;
/**
* 存放所有国家、省会、城市
*/
private Map<String, Map<String, List<String>>> addressInfoMap = new HashMap<>();
/**
* 存放所有英文和中文,<英文,中文>
*/
private Map<String, String> englishCnMap = new HashMap<>();
/**
* 存放所有国家
*/
private List<String> countrys = new ArrayList<>();
/**
* 存放所有省会
*/
private List<String> province = new ArrayList<>();
/**
* 存放所有城市和省会<城市,省会>
*/
private Map<String, String> citysToProvince = new HashMap<>();
/**
* 存放所有城市和省会<省会,国家>
*/
private Map<String, String> provinceToCountrys = new HashMap<>();
public WorldAddressUtils() {
try (
//读取文件为字节流
FileInputStream file = new FileInputStream(addressFilePath);
//字节流转化为字符流,以UTF-8读取防止中文乱码
InputStreamReader in = new InputStreamReader(file, "UTF-8");
//加入到缓存
BufferedReader buf = new BufferedReader(in);
) {
String str = "";
//按行读取,到达最后一行返回null
while ((str = buf.readLine()) != null) {
String[] engCn = str.split("#");
//enName是英文的地名
String enName = engCn[0].trim();
//enName是中文的地名
String cnName = engCn[1].trim();
englishCnMap.put(engCn[0].trim().toLowerCase(), cnName);
char[] chars = engCn[0].toCharArray();
//每一行前的空格数,0是国家,2是省会,4是城市
int spaceCount = 0;
for (int i = 0; i < chars.length; i++) {
if (chars[i] != ' ') {
break;
} else if (chars[i] == ' ') {
spaceCount += 1;
}
}
if (enName.length() == 1 && fillterSingleChar) {
continue;
}
if (0 == spaceCount) {
countrys.add(cnName);
//存放一个新的国家
addressInfoMap.put(cnName, new HashMap<>());
}
//从countrys获取最后一个国家的所有省会
Map<String, List<String>> provinceMap = addressInfoMap.get(countrys.get(countrys.size() - 1));
if (2 == spaceCount) {
province.add(cnName);
//存放一个新的省会
provinceMap.put(cnName, new ArrayList<>());
provinceToCountrys.put(cnName, countrys.get(countrys.size() - 1));
}
//存放一个新的城市
if (spaceCount == 4) {
String provinceStr = province.get(province.size() - 1);
List<String> cityList = provinceMap.get(provinceStr);
cityList.add(cnName);
citysToProvince.put(cnName, provinceStr);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取所有的国家名称
*/
public JSONObject getAllCountrys() {
JSONObject jsonObject = new JSONObject();
jsonObject.put("countrys", JSONArray.parseArray(JSON.toJSONString(countrys)));
return jsonObject;
}
/**
* 获取所有的国家名称和对应的省会
*/
public JSONObject getAllCountrysProvince() {
JSONObject jsonObject = new JSONObject();
JSONArray jsonArray = new JSONArray();
for (Map.Entry<String, Map<String, List<String>>> entryMap : addressInfoMap.entrySet()) {
JSONObject countrysProvince = new JSONObject();
JSONArray provinceArray = new JSONArray();
for (Map.Entry<String, List<String>> map : entryMap.getValue().entrySet()) {
provinceArray.add(map.getKey());
}
countrysProvince.put("country", entryMap.getKey());//国家
countrysProvince.put("province", provinceArray);//省会
jsonArray.add(countrysProvince);
jsonObject.put("countrysProvince", jsonArray);
}
return jsonObject;
}
/**
* 获取所有的国家名称和对应的省会和城市
*/
public JSONObject getAllCountrysProvinceCity() {
JSONObject jsonObject = new JSONObject();
JSONArray jsonArray = new JSONArray();
for (Map.Entry<String, Map<String, List<String>>> entryMap : addressInfoMap.entrySet()) {
JSONObject countrysProvince = new JSONObject();
JSONArray provinceArray = new JSONArray();
for (Map.Entry<String, List<String>> map : entryMap.getValue().entrySet()) {
List<String> cityList = map.getValue();//城市
JSONArray cityArray = JSONArray.parseArray(JSON.toJSONString(cityList));
JSONObject provinceCity = new JSONObject();//存城市和省会
provinceCity.put("province", map.getKey());
provinceCity.put("city", cityArray);
provinceArray.add(provinceCity);
}
countrysProvince.put("country", entryMap.getKey());//国家
countrysProvince.put("provinceCity", provinceArray);//省会、城市
jsonArray.add(countrysProvince);
jsonObject.put("countrysProvince", jsonArray);
}
return jsonObject;
}
/**
* 获取指定国家下的省会、城市
*/
public JSONObject getProvinceFromCountry(String country) {
if (englishCnMap.containsKey(country.toLowerCase())) {
//如果输入的是英文转换成中文
country = englishCnMap.get(country.toLowerCase());
}
JSONObject jsonObject = new JSONObject();
JSONArray jsonArray = new JSONArray();
for (Map.Entry<String, Map<String, List<String>>> entryMap : addressInfoMap.entrySet()) {
if (country.equals(entryMap.getKey())) {
JSONObject countrysProvince = new JSONObject();
JSONArray provinceArray = new JSONArray();
for (Map.Entry<String, List<String>> map : entryMap.getValue().entrySet()) {
List<String> cityList = map.getValue();//城市
JSONArray cityArray = JSONArray.parseArray(JSON.toJSONString(cityList));
JSONObject provinceCity = new JSONObject();//存城市和省会
provinceCity.put("province", map.getKey());
provinceCity.put("city", cityArray);
provinceArray.add(provinceCity);
}
countrysProvince.put("country", entryMap.getKey());//国家
countrysProvince.put("provinceCity", provinceArray);//省会、城市
jsonArray.add(countrysProvince);
jsonObject.put("countrysProvince", jsonArray);
}
}
return jsonObject;
}
/**
* 获取指定省会下的城市
*/
public JSONObject getCityFromProvince(String province) {
if (englishCnMap.containsKey(province.toLowerCase())) {
//如果输入的是英文转换成中文
province = englishCnMap.get(province.toLowerCase());
}
JSONObject jsonObject = new JSONObject();
JSONArray jsonArray = new JSONArray();
for (Map.Entry<String, Map<String, List<String>>> entryMap : addressInfoMap.entrySet()) {
//根据省会获取国家并判断相等
if (provinceToCountrys.get(province).equals(entryMap.getKey())) {
JSONObject countrysProvince = new JSONObject();
JSONArray provinceArray = new JSONArray();
for (Map.Entry<String, List<String>> map : entryMap.getValue().entrySet()) {
if (province.equals(map.getKey())) {
List<String> cityList = map.getValue();//城市
JSONArray cityArray = JSONArray.parseArray(JSON.toJSONString(cityList));
JSONObject provinceCity = new JSONObject();//存城市和省会
provinceCity.put("province", map.getKey());
provinceCity.put("city", cityArray);
provinceArray.add(provinceCity);
}
}
countrysProvince.put("country", entryMap.getKey());//国家
countrysProvince.put("provinceCity", provinceArray);//省会、城市
jsonArray.add(countrysProvince);
jsonObject.put("countrysProvince", jsonArray);
}
}
return jsonObject;
}
/**
* 根据城市获取所属省会的城市和国家
*/
public JSONObject getCityFromCountry(String city) {
if (englishCnMap.containsKey(city.toLowerCase())) {
//如果输入的是英文转换成中文
city = englishCnMap.get(city.toLowerCase());
}
JSONObject jsonObject = new JSONObject();
JSONArray jsonArray = new JSONArray();
for (Map.Entry<String, Map<String, List<String>>> entryMap : addressInfoMap.entrySet()) {
String getProvince = citysToProvince.get(city);
if (provinceToCountrys.get(getProvince).equals(entryMap.getKey())) {//根据省会获取国家过滤
JSONObject countrysProvince = new JSONObject();
JSONArray provinceArray = new JSONArray();
for (Map.Entry<String, List<String>> map : entryMap.getValue().entrySet()) {
if (getProvince.equals(map.getKey())) {
List<String> cityList = map.getValue();//城市
JSONArray cityArray = JSONArray.parseArray(JSON.toJSONString(cityList));
JSONObject provinceCity = new JSONObject();//存城市和省会
provinceCity.put("province", map.getKey());
provinceCity.put("city", cityArray);
provinceArray.add(provinceCity);
}
}
countrysProvince.put("country", entryMap.getKey());//国家
countrysProvince.put("provinceCity", provinceArray);//省会、城市
jsonArray.add(countrysProvince);
jsonObject.put("countrysProvince", jsonArray);
}
}
return jsonObject;
}
}
三、测试
import utils.WorldAddressUtils;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
WorldAddressUtils a=new WorldAddressUtils();
System.out.println(a.getProvinceFromCountry("中国"));//获取指定国家下的省会、城市
/* System.out.println(a.getAllCountrys());//获取所有国家
System.out.println(a.getAllCountrysProvince());//获取所有国家、省会
System.out.println(a.getAllCountrysProvinceCity());//获取所有国家、省会和城市
System.out.println(a.getCityFromProvince("河北"));//获取指定省会下的城市
System.out.println(a.getCityFromCountry("保定"));//根据城市获取所属省会的城市和国家*/
}
}
四、结果
{
"countrysProvince": [{
"provinceCity": [{
"province": "山东",
"city": ["滨州", "东营", "德州", "菏泽", "济宁", "济南", "聊城", "莱芜", "临沂", "青岛", "日照", "泰安", "潍坊", "威海", "烟台", "淄博", "枣庄"]
}, {
"province": "福建",
"city": ["福州", "龙岩", "宁德", "南平", "莆田", "泉州", "三明", "厦门", "漳州"]
}, {
"province": "台湾",
"city": ["高雄市", "花莲县", "基隆市", "金门县", "嘉义市", "嘉义县", "连江县", "苗栗县", "南投县", "屏东县", "澎湖县", "台北市", "台东县", "台南市", "桃园县", "台中市", "新北市", "新竹市", "新竹县", "宜兰县", "云林县", "彰化县"]
}, {
"province": "河北",
"city": ["保定", "承德", "沧州", "邯郸", "衡水", "廊坊", "秦皇岛", "石家庄", "唐山", "邢台", "张家口"]
}, {
"province": "河南",
"city": ["安阳", "鹤壁", "济源", "焦作", "开封", "漯河", "洛阳", "南阳", "平顶山", "濮阳", "三门峡", "商丘", "许昌", "新乡", "信阳", "周口", "驻马店", "郑州"]
}, {
"province": "重庆",
"city": ["北碚", "巴南", "璧山", "城口", "大渡口", "垫江", "大足", "丰都", "奉节", "涪陵", "合川", "江北", "江津", "九龙坡", "开县", "两江新区", "梁平", "南岸", "南川", "彭水", "黔江", "綦江", "荣昌", "沙坪坝", "双桥", "石柱", "铜梁", "潼南", "武隆", "巫山", "万盛", "巫溪", "万州", "秀山", "渝北", "永川", "云阳", "酉阳", "渝中", "长寿", "忠县"]
}, {
"province": "湖北",
"city": ["恩施", "鄂州", "黄冈", "黄石", "荆门", "荆州", "潜江", "神农架", "十堰", "随州", "天门", "武汉", "孝感", "咸宁", "仙桃", "襄阳", "宜昌"]
}, {
"province": "湖南",
"city": ["常德", "郴州", "怀化", "衡阳", "娄底", "邵阳", "湘潭", "湘西", "益阳", "岳阳", "永州", "张家界", "长沙", "株洲"]
}, {
"province": "海南",
"city": ["白沙", "保亭", "昌江", "澄迈", "定安", "东方", "儋州", "海口", "乐东", "临高", "陵水", "琼海", "琼中", "三沙", "三亚", "屯昌", "文昌", "万宁", "五指山"]
}, {
"province": "江西",
"city": ["抚州", "赣州", "吉安", "景德镇", "九江", "南昌", "萍乡", "上饶", "新余", "宜春", "鹰潭"]
}, {
"province": "黑龙江",
"city": ["大庆", "大兴安岭", "哈尔滨", "鹤岗", "黑河", "佳木斯", "鸡西", "牡丹江", "齐齐哈尔", "七台河", "绥化", "双鸭山", "伊春"]
}, {
"province": "天津",
"city": ["北辰", "宝坻", "滨海新区", "东丽", "河北", "河东", "和平", "红桥", "河西", "静海", "津南", "蓟县", "宁河", "南开", "武清", "西青"]
}, {
"province": "贵州",
"city": ["安顺", "毕节", "贵阳", "六盘水", "黔东南", "黔南", "黔西南", "铜仁", "遵义"]
}, {
"province": "陕西",
"city": ["安康", "宝鸡", "汉中", "商洛", "铜川", "渭南", "西安", "咸阳", "延安", "榆林"]
}, {
"province": "新疆",
"city": ["阿克苏", "阿拉尔", "阿勒泰", "博尔塔拉", "巴音郭楞", "昌吉", "哈密", "和田", "克拉玛依", "喀什", "克孜勒苏", "石河子", "塔城", "吐鲁番", "图木舒克", "五家渠", "乌鲁木齐", "伊犁"]
}, {
"province": "澳门",
"city": ["大堂区", "氹仔", "风顺堂区", "花地玛堂区", "路环岛", "圣安多尼堂区", "望德堂区"]
}, {
"province": "江苏",
"city": ["常州", "淮安", "连云港", "南京", "南通", "宿迁", "苏州", "泰州", "无锡", "徐州", "盐城", "扬州", "镇江"]
}, {
"province": "安徽",
"city": ["安庆", "蚌埠", "亳州", "巢湖", "池州", "滁州", "阜阳", "淮北", "合肥", "淮南", "黄山", "六安", "马鞍山", "宿州", "铜陵", "芜湖", "宣城"]
}, {
"province": "西藏",
"city": ["阿里", "昌都", "拉萨", "林芝", "那曲", "日喀则", "山南"]
}, {
"province": "吉林",
"city": ["白城", "白山", "吉林", "辽源", "四平", "松原", "通化", "延边", "长春"]
}, {
"province": "上海",
"city": ["宝山", "崇明", "奉贤", "虹口", "黄浦", "静安", "嘉定", "金山", "卢湾", "闵行", "浦东新区", "普陀", "青浦", "松江", "徐汇", "杨浦", "闸北", "长宁"]
}, {
"province": "甘肃",
"city": ["白银", "定西", "甘南", "金昌", "酒泉", "嘉峪关", "陇南", "临夏", "兰州市", "平凉", "庆阳", "天水", "武威", "张掖"]
}, {
"province": "宁夏",
"city": ["固原", "石嘴山", "吴忠", "银川", "中卫"]
}, {
"province": "山西",
"city": ["大同", "晋城", "晋中", "临汾", "吕梁", "朔州", "太原", "忻州", "运城", "阳泉", "长治"]
}, {
"province": "香港",
"city": ["北区", "大埔区", "东区", "观塘区", "黄大仙区", "九龙城区", "葵青区", "离岛区", "南区", "荃湾区", "深水埗区", "沙田区", "屯门区", "湾仔区", "西贡区", "油尖旺区", "元朗区", "中西区"]
}, {
"province": "四川",
"city": ["阿坝", "巴中", "成都", "德阳", "达州", "广安", "广元", "甘孜", "凉山", "乐山", "泸州", "眉山", "绵阳", "南充", "内江", "攀枝花", "遂宁", "雅安", "宜宾", "自贡", "资阳"]
}, {
"province": "广西",
"city": ["北海", "百色", "崇左", "防城港", "贵港", "桂林", "河池", "贺州", "来宾", "柳州", "南宁", "钦州", "梧州", "玉林"]
}, {
"province": "浙江",
"city": ["湖州", "杭州", "金华", "嘉兴", "丽水", "宁波", "衢州", "绍兴", "台州", "温州", "舟山"]
}, {
"province": "云南",
"city": ["保山", "楚雄", "德宏", "大理", "迪庆", "红河", "昆明", "临沧", "丽江", "怒江", "普洱", "曲靖", "文山", "西双版纳", "玉溪", "昭通"]
}, {
"province": "内蒙古",
"city": ["阿拉善", "包头", "巴彦淖尔", "赤峰", "鄂尔多斯", "呼和浩特", "呼伦贝尔", "通辽", "乌海", "乌兰察布", "兴安", "锡林郭勒"]
}, {
"province": "辽宁",
"city": ["鞍山", "本溪", "朝阳", "丹东", "大连", "抚顺", "阜新", "葫芦岛", "锦州", "辽阳", "盘锦", "沈阳", "铁岭", "营口"]
}, {
"province": "广东",
"city": ["潮州", "东莞", "佛山", "广州", "河源", "惠州", "江门", "揭阳", "茂名", "梅州", "清远", "韶关", "汕头", "汕尾", "深圳", "云浮", "阳江", "珠海", "湛江", "肇庆", "中山"]
}, {
"province": "青海",
"city": ["果洛", "海北", "海东", "黄南", "海南", "海西", "西宁", "玉树"]
}, {
"province": "北京",
"city": ["昌平", "朝阳", "东城", "大兴", "房山", "丰台", "海淀", "怀柔", "门头沟", "密云", "平谷", "石景山", "顺义", "通州", "西城", "延庆"]
}],
"country": "中国"
}]
}