不使用pinyin4j, 通过字符串截取手段快速查询通讯录联系人的拼音(包括全拼和简拼)

来源:互联网 发布:mac外接显示器如何设置 编辑:程序博客网 时间:2024/04/30 03:32

不使用pinyin4j, 通过字符串截取手段快速查询通讯录联系人的拼音(包括全拼和简拼)

刚开始我也是使用pinyin4j但是速度太慢8分钟还加载不完我的280个联系人数据,所以我选择另谋出路。发现有个字段包含拼音,“ContactsContract.CommonDataKinds.Phone.SORT_KEY_PRIMARY”,就是这个字段,但是是很变态的拼音,比如姓名为“成龙”这个联系人的这个字段的值是”CHENG 成 LONG 龙”注意里面都有空格,而且拼音都为大写,
再比如“liu德华”字段值为”lzizuz DE 德 HUA 华”,非中文后面都会加上”z”,让我很难过,本来想着直接截取的,这样使我的截取方式变得困难。事在人为嘛,看过”最强大脑“明显脑子好用了点,想到了办法。具体请看代码。很简单,有问题再问我

   public static List<contact> getAllContacts(Context context) {            List<contact> list = new ArrayList<contact>();            ContentResolver resolver = context.getContentResolver();            Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;            String[] projection = new String[] {                    ContactsContract.CommonDataKinds.Phone.NUMBER,// 电话号码                    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,// 用户名                    ContactsContract.CommonDataKinds.Phone.SORT_KEY_PRIMARY,                    //ContactsContract.CommonDataKinds.Phone.CONTACT_ID // 联系人id            };            String selection = null;            String[] selectionArgs = null;            String sortOrder = ContactsContract.CommonDataKinds.Phone.SORT_KEY_PRIMARY;            Cursor cursor = null;            try {                cursor = resolver.query(uri, projection, selection,                        selectionArgs,sortOrder);                if (cursor != null && cursor.getCount() > 0) {                    while (cursor.moveToNext()) {                        String number = cursor.getString(0);// 电话号码                        String name = cursor.getString(1);                        String sortPinYin = cursor.getString(2);                        contact object = new contact();                        String numNoSpace = number.replaceAll(" ","").replaceAll("-","");                        object.setNumber(numNoSpace);                        object.setName(name);                        String[] fullShortPinYin = getFullShortPinYin(name, sortPinYin);                        object.setFullPinyin(fullShortPinYin[0]);                        object.setShortpinyin(fullShortPinYin[1]);                        list.add(object);                    }                }            } finally {                if (cursor != null) {                    cursor.close();                }            }            return list;        }        private static String[] getFullShortPinYin(String name,String sortPinYin) {            String [] fullShortPinYin = new String[2];            char[] chars = name.toCharArray();            StringBuilder fullPin = new StringBuilder();            StringBuilder shortPin = new StringBuilder();            for (int i = 0; i < chars.length; i++) {                String anStr = String.valueOf(chars[i]);                if (anStr.matches("[\\u4e00-\\u9fa5]")){                    String rep = " [A-Z]+ " + anStr + "|" + "\\s*[A-Z]+ " + anStr;                    Pattern pattern = Pattern.compile(rep);                    Matcher matcher = pattern.matcher(sortPinYin);                    if (matcher.find()){                        String findStr = matcher.group().trim();                        String resutlStr = findStr.split(" ")[0];                        fullPin.append(resutlStr);                        shortPin.append(resutlStr.substring(0,1));                    }                }else {                    fullPin.append(chars[i]);                    shortPin.append(chars[i]);                }            }            fullShortPinYin[0] = fullPin.toString().toLowerCase();            fullShortPinYin[1] = shortPin.toString().toLowerCase();            return fullShortPinYin;        }

各位:经过测试,以上方法并不适合所有手机,找到一个通用而且快速的方法。
用tinyPinyin

0 0
原创粉丝点击