谈谈如何从字符串中识别出中文地址

今天,我们就来聊聊怎么从一个字符串中解析出地址。
有以下几种情况:
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};
    }

猜你喜欢

转载自blog.csdn.net/ooyhao/article/details/81016473