联系人姓名的多音字的匹配

来源:互联网 发布:50部网络禁书目录 编辑:程序博客网 时间:2024/04/27 13:17

联系人姓名的多音字的匹配

Eg:百家姓"乐"显示在L分组中,应该是显示在Y分组

 

详细操作步骤:

1.创建"乐"姓联系人

2.查看联系人列表中该联系人的位置

测试结果:

2.该联系人显示在L分组中

期望结果:

2.百家姓中"乐"字读yue,应该显示在Y分组

 

包:com.android.providers.contacts中的HanziToPinyin.java做修改

 

//为联系人名字做多音字匹配

         //forsepcialHanzi handle

   public static  Map<String,Pair<Integer,String>>specialHanziString = new HashMap<String, Pair<Integer,String>>();

   

   static {

       specialHanziString.put("银行", newPair<Integer,String>(1,"航"));

       specialHanziString.put("院长", newPair<Integer,String>(1,"涨"));

    }

        

         在下面的方法中进行汉字转拼音的处理

         publicArrayList<Token> get(final String input) //One Hanzi character which haspinyin will be treated as a Token

                  

       //for sepcialHanzi handle

       int replace_pos = -1;

       char replace_char = 0;

       for (Map.Entry<String,Pair<Integer,String>> cur

       : specialHanziString.entrySet()){

          int pos = -1;

          pos = input.lastIndexOf(cur.getKey());

          if(pos != -1) {

                replace_pos = pos +cur.getValue().first;

                replace_char =cur.getValue().second.charAt(0);

                break;

         }

       }

                   该段code是进行名字中有多音字时选择想要的音的处理

                  

                   在for循环中继续做如下处理

                           //for sepcialHanzi handle

                boolean isSpecial = false;

                if(replace_pos != -1 &&replace_pos == i) {

                    t = getToken(replace_char);

                    isSpecial = true;

                } else {

                    t = getToken(character);

                }

                                    

                //for sepcialHanzi handle

                if(isSpecial) {  

                    t.source =sb.append(character).toString();

                }

                  

                tokens.add(t);

                sb.setLength(0);                                 

        

        

         //为联系人的姓做多音字匹配                        

   private boolean isFamilyName = false;//加入isFamilyName是因为要做名字的多音字的匹配

   public static Map<String, Character> specialHanzi = newHashMap<String, Character>();

   static {

       specialHanzi.put("8d3e", '\u7532'); // 贾--甲

       specialHanzi.put("5355", '\u5584'); // 单--善

       specialHanzi.put("6c88", '\u6df1'); // 沈--深

       specialHanzi.put("4ec7", '\u6c42'); // 仇--求

       specialHanzi.put("89e3", '\u8c22'); // 解--谢

 

       specialHanzi.put("7fdf", '\u5b85'); // 翟--宅

       specialHanzi.put("67e5", '\u4e4d'); // 查--乍

       specialHanzi.put("66fe", '\u589e'); // 曾--增

       specialHanzi.put("665f", '\u6210'); // 晟--成

       specialHanzi.put("4e50", '\u6708'); // 乐--月

 

       specialHanzi.put("533a", '\u6b27'); // 区--欧

       specialHanzi.put("51af", '\u9022'); // 冯--逢

       specialHanzi.put("7e41", '\u5a46'); // 繁--婆

       specialHanzi.put("957f", '\u8d26'); // 长--帐

       specialHanzi.put("77f3", '\u65f6'); // 石--时

 

       specialHanzi.put("67cf", '\u6446'); // 柏--摆

       specialHanzi.put("6734", '\u666e'); // 朴--普

       specialHanzi.put("7f2a", '\u79d2'); // 缪--秒

 

    }

        

         //改方法是把汉字字符转化为得到token

         privateToken getToken(char character) {

 

       if((specialHanzi.get(Integer.toHexString(character))!=null)&&(isFamilyName== true)){

           character = specialHanzi.get(Integer.toHexString(character));

       }

         在上面的get()方法中可以做判断isFmialyName是不是为true,

        

                 if (i == 0) {

                isFamilyName = true;

           } else {

                isFamilyName = false;

           }

    

0 0