android 实现汉字排序功能的 整理和思考
想实现安卓市场这个效果,开始想通过调用android的本地化功能实现:
[java] view plain copy print ?
- omparatorcmp=Collator.getInstance(java.util.Locale.CHINA);
- Arrays.sort(names,cmp);
这个可以实现简单的汉字排序功能,按 汉字拼音的第一个字母的英文字母顺序排序,这个真正用起来不太灵活,特别是对比较的不是集合对象本身,而是集合对象的一个字段的情况下,这种方法就比较麻烦了,于是重写类实现 Comparator接口
[java] view plain copy print ?
- publicclassCollatorComparatorimplementsComparator{
- Collatorcollator=Collator.getInstance();
- publicintcompare(Objectelement1,Objectelement2){
- CollationKeykey1=collator
- .getCollationKey(((AppInfo)element1).appName);
- CollationKeykey2=collator
- .getCollationKey(((AppInfo)element2).appName);
- returnkey1.compareTo(key2);
- }
- }
通过: [java] view plain copy print ?
- List<AppInfo>Softpacks=newArrayList<AppInfo>();
- Collections.sort(Softpacks,newCollatorComparator());
实现以AppInfo类的appName对象作为排序字段,这样使用起来就比较灵活了。可以顺利实现汉字的排序。
这时想实现在显示的item上按 A,B,C分隔开显示,这时就要找出汉字的拼音 或者 拼音的第一个字母,查找下网上的资料,有这个相关的第三方jar包 ,pinyin4j-2.5.0.jar
下载过来 :
[java] view plain copy print ?
- importnet.sourceforge.pinyin4j.PinyinHelper;
- importnet.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
- importnet.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
- importnet.sourceforge.pinyin4j.format.HanyuPinyinToneType;
- importnet.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
- /**
- *汉字转换位汉语拼音,英文字符不变
- *@authorxuke
- *
- */
- publicclassCn2Spell{
- /**
- *汉字转换位汉语拼音首字母,英文字符不变
- *@paramchines汉字
- *@return拼音
- */
- publicstaticStringconverterToFirstSpell(Stringchines){
- StringpinyinName="";
- char[]nameChar=chines.toCharArray();
- HanyuPinyinOutputFormatdefaultFormat=newHanyuPinyinOutputFormat();
- defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
- defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
- for(inti=0;i<nameChar.length;i++){
- if(nameChar[i]>128){
- try{
- pinyinName+=PinyinHelper.toHanyuPinyinStringArray(nameChar[i],defaultFormat)[0].charAt(0);
- }catch(BadHanyuPinyinOutputFormatCombinatione){
- e.printStackTrace();
- }
- }else{
- pinyinName+=nameChar[i];
- }
- }
- returnpinyinName;
- }
- /**
- *汉字转换位汉语拼音,英文字符不变
- *@paramchines汉字
- *@return拼音
- */
- publicstaticStringconverterToSpell(Stringchines){
- StringpinyinName="";
- char[]nameChar=chines.toCharArray();
- HanyuPinyinOutputFormatdefaultFormat=newHanyuPinyinOutputFormat();
- defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
- defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
- for(inti=0;i<nameChar.length;i++){
- if(nameChar[i]>128){
- try{
- pinyinName+=PinyinHelper.toHanyuPinyinStringArray(nameChar[i],defaultFormat)[0];
- }catch(BadHanyuPinyinOutputFormatCombinatione){
- e.printStackTrace();
- }
- }else{
- pinyinName+=nameChar[i];
- }
- }
- returnpinyinName;
- }
- }
通过调用converterToFirstSpell(String chines)方法,获得汉字拼音的首字母,顺利实现上述功能
虽然可以顺利实现,但是通过引用第三方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(安卓)Studio 微信分享功能(包括可以分享到朋友圈,分享到朋
- Android实现双击TitleBar回顶部的功能示例代码
- android 自定义LabelView实现各类小标签,重要功能已标注
- Android实现中文按拼音排序方法
- 利用OpenGL ES、手机传感器、相机和调用百度语音包服务,实现AR+语
- Android关闭USB的ADB调试和文件传输功能(禁用USB)
- Android(安卓)代码自动提示功能
- android格式化手机号的功能
- Unity实战篇:实现安卓手机的复制粘贴功能(与原生Android交互)