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

不使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值