拼音查找


题:
我们在使用手机通信录的时候,都希望能快速定位某人。
比较流行的做法是输入拼音首字母。
假设某个列表中存储着许多联系人的名字。请设计一种机制能够从给定的拼音定位到合适的人名,如有多个人匹配,则定位多个人。
能支持模糊音吗?
提示: 汉字的GBK编码就是按照拼音顺序的。只要抽出每个声母的开始汉字就可以了。

源码PinyinSorting.java


import static PinyinAlpha.PinyinAlpha.getFA;

import java.util.List;
import java.util.ArrayList;

public class PinyinSorting {
    public static void main(String args[]) {
        List<String> lst = new ArrayList<String>();
        lst.add("容祖儿");
        lst.add("古巨基");
        lst.add("苏打绿");
        lst.add("金沙");
        lst.add("陈奕迅");
        lst.add("金海心");
        lst.add("方大同");
        lst.add("潘玮柏");
        lst.add("邓紫棋");
        lst.add("筷子兄弟");
        lst.add("陈绮贞");
        // 重名 !
        lst.add("梁静茹");
        lst.add("江语晨");
        lst.add("张学友");
        lst.add("梁静茹");
        lst.add("梁咏琪");
        
        String fd = "L";
        
        String[] st = new String[lst.size()];
        for (int i=0; i<lst.size(); i++) {
            st[i] = getFA(lst.get(i));
        }
        for (int i=0; i<lst.size(); i++) {
            if (st[i].equals(fd)) {
                System.out.println(lst.get(i));
            }
        }
    }
}

源码2PinyinAlpha.java


package PinyinAlpha;

import java.io.UnsupportedEncodingException;

public class PinyinAlpha {

    private final static int[] AREA_CODE = {
        45217, 45253, 45761, 46318, 46826, 47010, 47297, 47614, 48119, 48119, 49062, 
        49324, 49896, 50371, 50614, 50622, 50906, 51387, 51446, 52218, 52698, 52698, 
        52698, 52980, 53689, 54481};

    public static String getAA(String tx) {

        if (tx==null || tx.equals("")) {
            return "";
        }
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i lt; tx.length(); i++) {
            sb.append(getAlpha(tx.substring(i, i+1)));
        }
        return sb.toString();
    }

    public static String getFA(String tx) {
        if (tx==null || tx.equals("")) {
            return "";
        }
        if (tx.length()>1) {
            tx = tx.split("")[0];
        }
        return getAlpha(tx);
    }
    
    private static String getAlpha(String ch) {
        byte[] bytes;
        try {
            bytes = ch.getBytes("GBK");
        }
        catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return ch;
        }
        if (bytes.lengthlt;2) {
            return ch;
        }
        int area = (short) bytes[0];
        int pos = (short) bytes[1];
        int code = (arealt;lt;8 & 0xff00) + (pos & 0xff);
        for (int i=0; ilt;26; i++) {
            int max = 55290;
            if (i!=25) {
                max = AREA_CODE[i+1];
            }
            if (AREA_CODE[i]<=code && codelt;max) {
                return new String(new byte[]{(byte) (65+i)});
            }
        }
        return ch;
    }   
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注