今天,我们就来聊聊怎么从一个字符串中解析出地址。
有以下几种情况:
1.标准的格式 省,市,区...
2.没有省,但是包含以下级别地区的关键字。
3.没有省,也没有其他地区的关键字。
我们可以使用indexOf("关键字")来进行定位,但是不能保证地址中不包括关键字,比如袁州区,州和区都是关键字。
这样就需要把所有的关键字全部定位出来,再使用subString()来进行截取,然后进行判断是否为地址。
第一种情况:以下没有提出解决方式,稍微简单,可发邮件至[email protected]。
第二种情况:以下代码主要解决此类情况
第三种情况:则只需要使用下列代码取第一级方式即可获取所有地区。
完整解决方式+源码,请联系我。
/**
* 需求分析:
* 1.字符串中的关键字有 [市, 区, 县, 旗, 盟, 州, 岛]
* 2.第一级 :省 区(自治区、特别行政区)市(直辖市)
* 3.通过逐字递增和逐字递减的方式搜索第一级,
* 4.根据第一级查询第二级[市, 区, 县, 盟, 州, 岛]
* 5.根据第二级查询第三级[市, 区, 县, 旗, 盟, 州, 岛]
* 6.只有三级地址完全匹配才进行相应的操作,否则,不操作。
*
*/
/**
* 获取第一个级地址最大的长度
* @param addrList 需要检查的地址集合
* @return
*/
public static int getMaxLen(List<String> addrList){
if(addrList == null || addrList.size() == 0){
return -1;
}
int maxLen = addrList.get(0).length();
for(int i = 1; i < addrList.size(); i++){
if(maxLen < addrList.get(i).length()){
maxLen = addrList.get(i).length();
}
}
return maxLen;
}
/**
* 从地址中获取第一级地址
*
* @param addrList 第一级地址的数组
* @param address 要搜索第一级地址的字符串
* @param len 第一级地址的最大长度
* @return 数组 两个元素:
* 1.搜索到的地区在地区数组中的位置 -1表示不存在
* 2.地区的长度
*/
public static int[] getFirstLevel(List<String> addrList, String address,int len){
//记录第一级处于数组中的位置,0--N表示存在,-1表示不存在
int index = -1;
//记录临时子字符串
String s = "";
//记录截取的最大长度
int maxLen = 0;
//用来标识是否有匹配的标志位
boolean flag = false;
for(int i = 2; i <= len && i <= address.length(); i++){
//获取一个子串
s = address.substring(0,i);
for(int j = 0; j < addrList.size(); j++){
//判断省市的数组中是否包含该字符串
if(addrList.get(j).contains(s)){
index = j;
maxLen = i;
flag = true;
break;
}else{
flag = false;
}
}
if(!flag){
break;
}
}
//返回,第一个标识处于第一级数组中的位置,第二个标识截取的最大长度
return new int []{index,maxLen};
}
/**
*
* @param addrList 地区数组
* @param address 需要检测的字符串
* @param keywords 地区关键字数组
* @return 返回数组,两个元素,
* 1.地区在地区数组中的位置 -1表示不存在
* 2.地区的长度
*/
public static int [] getSecondOrThirdLevel(List<String> addrList, String address,String[] keywords){
//记录第二,三级处于数组中的位置,0--N表示存在,-1表示不存在
int index = -1;
//记录临时子字符串
String subString = "";
//记录截取的最大长度
int maxLen = 0;
//用来记住关键字下标的集合
List<Integer> keywordIndexs = new ArrayList<Integer>();
//1.获取字符串中所有匹配关键字的下标
for(int i = 0; i < address.length(); i++){
//获取字符串中的每一个字
String str = (char)address.charAt(i)+"";
//用每一个字去与关键字匹配,使用集合记住每一个下标
for(int j = 0; j < keywords.length; j++){
//循环关键字列表
if(str.equals(keywords[j])){
//如果当前字符与关键字中的字符相同,则记录其下标
keywordIndexs.add(i);
}
}
}
//2.通过记录好的下标,去二级数组中查询
for(int i = 0; i<keywordIndexs.size(); i++){
//遍历下标集合,获取子串
subString = address.substring(0,keywordIndexs.get(i)+1);
for(int j = 0; j < addrList.size(); j++){
if(subString.equals(addrList.get(j))){
index = j;
maxLen = keywordIndexs.get(i)+1;
}
}
}
return new int[]{index,maxLen};
}