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

本文探讨了在Android中实现汉字排序的方法,包括利用本地化功能进行简单排序以及通过自定义Comparator实现更灵活的排序。文章提到了使用pinyin4j库获取汉字拼音首字母以实现分组显示,但为避免依赖第三方库,作者提出探索Android系统内部汉字转拼音的机制,以寻找更轻量级的解决方案,并给出了相关源码追踪的文章链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 想实现安卓市场这个效果,开始想通过调用android的本地化功能实现:

 

 omparator cmp = Collator.getInstance(java.util.Locale.CHINA);
 Arrays.sort(names, cmp);


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

 

public class CollatorComparator implements Comparator {
		Collator collator = Collator.getInstance();

		public int compare(Object element1, Object element2) {

			CollationKey key1 = collator
					.getCollationKey(((AppInfo) element1).appName);
			CollationKey key2 = collator
					.getCollationKey(((AppInfo) element2).appName);
			return key1.compareTo(key2);
		}
	}

通过:
List<AppInfo> Softpacks = new ArrayList<AppInfo>();
 Collections.sort(Softpacks, new CollatorComparator());


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

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

下载过来 :

 

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

/**  
 * 汉字转换位汉语拼音,英文字符不变  
 * @author xuke  
 *  
 */  
public class Cn2Spell {   
    
    /**  
    * 汉字转换位汉语拼音首字母,英文字符不变  
    * @param chines 汉字  
    * @return 拼音  
    */  
    public static String converterToFirstSpell(String chines){          
        String pinyinName = "";   
        char[] nameChar = chines.toCharArray();   
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();   
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);   
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);   
        for (int i = 0; i < nameChar.length; i++) {   
            if (nameChar[i] > 128) {   
                try {   
                    pinyinName += PinyinHelper.toHanyuPinyinStringArray(nameChar[i], defaultFormat)[0].charAt(0);   
                } catch (BadHanyuPinyinOutputFormatCombination e) {   
                    e.printStackTrace();   
                }   
            }else{   
                pinyinName += nameChar[i];   
            }   
        }   
        return pinyinName;   
    }   
    
    /**  
    * 汉字转换位汉语拼音,英文字符不变  
    * @param chines 汉字  
    * @return 拼音  
    */  
    public static String converterToSpell(String chines){           
        String pinyinName = "";   
        char[] nameChar = chines.toCharArray();   
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();   
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);   
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);   
        for (int i = 0; i < nameChar.length; i++) {   
            if (nameChar[i] > 128) {   
                try {   
                    pinyinName += PinyinHelper.toHanyuPinyinStringArray(nameChar[i], defaultFormat)[0];   
                } catch (BadHanyuPinyinOutputFormatCombination e) {   
                    e.printStackTrace();   
                }   
            }else{   
                pinyinName += nameChar[i];   
            }   
        }   
        return pinyinName;   
    }   
       
}  


通过调用converterToFirstSpell(String chines)方法,获得汉字拼音的首字母,顺利实现上述功能 

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

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

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

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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值