android 实现汉字排序功能的 整理和思考

android 实现汉字排序功能的 整理和思考_第1张图片想实现安卓市场这个效果,开始想通过调用android的本地化功能实现:

 

[java]  view plain copy print ?
  1. omparator cmp = Collator.getInstance(java.util.Locale.CHINA);  
  2. Arrays.sort(names, cmp);  


这个可以实现简单的汉字排序功能,按 汉字拼音的第一个字母的英文字母顺序排序,这个真正用起来不太灵活,特别是对比较的不是集合对象本身,而是集合对象的一个字段的情况下,这种方法就比较麻烦了,于是重写类实现 Comparator接口

 

[java]  view plain copy print ?
  1. public class CollatorComparator implements Comparator {  
  2.         Collator collator = Collator.getInstance();  
  3.   
  4.         public int compare(Object element1, Object element2) {  
  5.   
  6.             CollationKey key1 = collator  
  7.                     .getCollationKey(((AppInfo) element1).appName);  
  8.             CollationKey key2 = collator  
  9.                     .getCollationKey(((AppInfo) element2).appName);  
  10.             return key1.compareTo(key2);  
  11.         }  
  12.     }  

通过:
[java]  view plain copy print ?
  1. List<AppInfo> Softpacks = new ArrayList<AppInfo>();  
  2.  Collections.sort(Softpacks, new CollatorComparator());  


实现以AppInfo类的appName对象作为排序字段,这样使用起来就比较灵活了。可以顺利实现汉字的排序。

  这时想实现在显示的item上按 A,B,C分隔开显示,这时就要找出汉字的拼音 或者 拼音的第一个字母,查找下网上的资料,有这个相关的第三方jar包 ,pinyin4j-2.5.0.jar

下载过来 :

 

[java]  view plain copy print ?
  1. import net.sourceforge.pinyin4j.PinyinHelper;  
  2. import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;  
  3. import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;  
  4. import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;  
  5. import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;  
  6.   
  7. /**   
  8.  * 汉字转换位汉语拼音,英文字符不变   
  9.  * @author xuke   
  10.  *   
  11.  */    
  12. public class Cn2Spell {     
  13.       
  14.     /**   
  15.     * 汉字转换位汉语拼音首字母,英文字符不变   
  16.     * @param chines 汉字   
  17.     * @return 拼音   
  18.     */    
  19.     public static String converterToFirstSpell(String chines){            
  20.         String pinyinName = "";     
  21.         char[] nameChar = chines.toCharArray();     
  22.         HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();     
  23.         defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);     
  24.         defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);     
  25.         for (int i = 0; i < nameChar.length; i++) {     
  26.             if (nameChar[i] > 128) {     
  27.                 try {     
  28.                     pinyinName += PinyinHelper.toHanyuPinyinStringArray(nameChar[i], defaultFormat)[0].charAt(0);     
  29.                 } catch (BadHanyuPinyinOutputFormatCombination e) {     
  30.                     e.printStackTrace();     
  31.                 }     
  32.             }else{     
  33.                 pinyinName += nameChar[i];     
  34.             }     
  35.         }     
  36.         return pinyinName;     
  37.     }     
  38.       
  39.     /**   
  40.     * 汉字转换位汉语拼音,英文字符不变   
  41.     * @param chines 汉字   
  42.     * @return 拼音   
  43.     */    
  44.     public static String converterToSpell(String chines){             
  45.         String pinyinName = "";     
  46.         char[] nameChar = chines.toCharArray();     
  47.         HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();     
  48.         defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);     
  49.         defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);     
  50.         for (int i = 0; i < nameChar.length; i++) {     
  51.             if (nameChar[i] > 128) {     
  52.                 try {     
  53.                     pinyinName += PinyinHelper.toHanyuPinyinStringArray(nameChar[i], defaultFormat)[0];     
  54.                 } catch (BadHanyuPinyinOutputFormatCombination e) {     
  55.                     e.printStackTrace();     
  56.                 }     
  57.             }else{     
  58.                 pinyinName += nameChar[i];     
  59.             }     
  60.         }     
  61.         return pinyinName;     
  62.     }     
  63.          
  64. }    


通过调用converterToFirstSpell(String chines)方法,获得汉字拼音的首字母,顺利实现上述功能  android 实现汉字排序功能的 整理和思考_第2张图片

 虽然可以顺利实现,但是通过引用第三方jar包,在android里也算是重量级实现了,于是想能不能不通过第三方pinyin4j-2.5.0.jar包实现这个功能

 通过网上搜寻,发现android2.2版本以后,数据库里有汉字联系人时,也有一个字段是存储汉字拼音的,也就是说 当你保存中文姓名联系人时,系统会调用一个方法把中文联系人转成拼音存储起来 ,于是想能不能找到系统调用的这个方法,通过这个方法实现汉字转换拼音的功能。网上看了下 有人已经追踪过此方面的源码:地址。

 http://blog.csdn.net/csuhanyong/article/details/6120935

 有时间在追踪下,先记录到这。


转自:http://blog.csdn.net/socketsyuhai/article/details/6834709

你可能感兴趣的:(android 实现汉字排序功能的 整理和思考)