zoukankan      html  css  js  c++  java
  • [转]Java汉字按照拼音排序

    最近项目上使用到汉字排序的问题,网上搜索了一下后普遍使用下面的方法比较。

    @Test  
    public void test_sort_pinyin() {  
        Collator cmp = Collator.getInstance(java.util.Locale.CHINA);  
        String[] arr = { "张三", "李四", "王五", "赵六", "JAVA", "123", "$%$#", "哈哈A",  
                "1哈哈A", "1哈哈b", "1哈哈a", "哈哈", "哈", "怡情" };  
        List<String> list = Arrays.asList(arr);  
        Arrays.sort(arr, cmp);  
        System.out.println(list);  
    }  

    输出结果如下:

    [$%$#, 123, 1哈哈a, 1哈哈A, 1哈哈b, JAVA, 哈, 哈哈, 哈哈A, 李四, 王五, 张三, 赵六, 怡情]

    发现了有个BUG,因为网上也看到一些朋友提出问题,所以测试时故意加上怡字。发现“怡”字果然最后了。所以只能再寻找解决办法。后来想起了之前把中文自动转拼音时使用到的类。

    pinyin4j 开源项目 具体可以查看 http://pinyin4j.sourceforge.net/   使用的是:pinyin4j-2.5.0.jar  这个包;

    真的不得不感谢这位人士。

    封装成比较器后代码如下:

    import java.util.Comparator;  
    import net.sourceforge.pinyin4j.PinyinHelper;  
    /** 
     * 汉字按照拼音排序的比较器 
     * @author KennyLee 2009-2-23 10:08:59 
     *  
     */  
    public class PinyinComparator implements Comparator<Object> {  
        public int compare(Object o1, Object o2) {  
            char c1 = ((String) o1).charAt(0);  
            char c2 = ((String) o2).charAt(0);  
            return concatPinyinStringArray(  
                    PinyinHelper.toHanyuPinyinStringArray(c1)).compareTo(  
                    concatPinyinStringArray(PinyinHelper  
                            .toHanyuPinyinStringArray(c2)));  
        }  
        private String concatPinyinStringArray(String[] pinyinArray) {  
            StringBuffer pinyinSbf = new StringBuffer();  
            if ((pinyinArray != null) && (pinyinArray.length > 0)) {  
                for (int i = 0; i < pinyinArray.length; i++) {  
                    pinyinSbf.append(pinyinArray[i]);  
                }  
            }  
            return pinyinSbf.toString();  
        }  
    }  

    继续执行测试

    @Test  
    public void test_sort_pinyin2() {  
        String[] arr = { "张三", "李四", "王五", "赵六", "JAVA", "123", "$%$#", "哈哈A",  
                "1哈哈A", "1哈哈b", "1哈哈a", "哈哈", "哈", "怡情" };  
        List<String> list = Arrays.asList(arr);  
        Arrays.sort(arr, new PinyinComparator());  
        System.out.println(list);  
    }  

    最终打印效果如下:

    [JAVA, 123, $%$#, 1哈哈A, 1哈哈b, 1哈哈a, 哈哈A, 哈哈, 哈, 李四, 王五, 怡情, 张三, 赵六]


    不过也由此看出,对于符号等其他排序也有一些争议的地方,但是关系不大。或者也可以再判断一下首字是否为中文,若不是再按照其他相应的比较方式。比较器的好处就是可以自定义了。

    例子中只是用了数组进行排序,但可能较多的情况下遇到的是对List的排序,即List<Object>。同样的可以举一反三的修改比较器中的compare方法,只要提取用来排序的的汉字关键字段出来即可。

    然后比较的时候调用

    Collections.sort(list,new PinyinComparator());

    而且注意例子中只是截取了首汉字进行排序,若需要可以进一步的排序。

    但主要还是中文的排序确实正确了。

    基本原理:

    其实弄来弄去,原理还是把汉字转成拼音,然后再进行排序罢了。所以如果在项目中有遇到过需要把汉字转换成拼音的需求的话。碰到汉字排序的话问题自然也会迎刃而解。

    也不得不感叹一句,在中国做研发比外国要辛苦啊。起码字符集就多了那么多,而且也没得到很多基本的支持,然后引发的一连串问题。例如乱码,汉字排序,转拼音等什么的...

    不过解决一个记下一个吧,以后就能直接使用了,算多学一点。

    转自:http://blog.csdn.net/kennylee26/article/details/3926168

  • 相关阅读:
    启动控制面板命令大全
    C#下载网页为mht文件
    基于C#语言的可编程表达式计算器设计
    FileSystemWatcher监视文件变动
    C#梁朝伟变刘德华之山寨实现
    Json之语法,格式
    Regex类
    C# 索引器
    优化正则表达式的诀窍
    正则表达式(二) 零宽断言与懒惰匹配以及平衡组
  • 原文地址:https://www.cnblogs.com/raphael5200/p/5146042.html
Copyright © 2011-2022 走看看