Java模块 -- 数组/集合中文汉字排序(支持生僻汉字)

这里举例List集合 , 对list中的中文进行排序 , 按照中文拼音首字母.

支持生僻汉字的话 , 需要使用一个jar包 , 链接地址如下

com.ibm.icu_3.8.jar

 

传统的 : 

        List<String> list = new ArrayList<String>();
        list.add("一鸣惊人 -Y");
        list.add("人山人海 -R");
        list.add("海阔天空 -H");
        list.add("空前绝后 -K");
        list.add("后来居上 -H");

        Comparator<Object> cmp = java.text.Collator.getInstance(java.util.Locale.CHINA);
        Collections.sort(list, cmp);
        for (String str : list) {
            System.out.println(str);
        }

输出结果:

海阔天空 -H
后来居上 -H
空前绝后 -K
人山人海 -R
一鸣惊人 -Y

这种看上去没有什么问题 , 但是换上生僻字之后 , 就会出现错误.

比如这样子:

        List<String> list1 = new ArrayList<String>();
        list1.add("网易汽车 - W");
        list1.add("新民汽车网 - X");
        list1.add("钛媒体 - T");
        list1.add("瘾科技 - Y");
        list1.add("昕薇网 - X");
        list1.add("安倍 - A");
        list1.add("中国 - Z");
        list1.add("中心 - Z");
        Comparator<Object> cmp = java.text.Collator.getInstance(java.util.Locale.CHINA);
        Collections.sort(list1, cmp);
        for (String str : list1) {
            System.out.println(str);
        }

输出结果:

安倍 - A
网易汽车 - W
新民汽车网 - X
中国 - Z
中心 - Z
昕薇网 - X
钛媒体 - T
瘾科技 - Y

这个结果就是错误的 , "钛媒体 - T" 应该在第二位...

解决方案 : 

使用 "com.ibm.icu.text.Collator" 替换 "java.text.Collator"

使用 "com.ibm.icu.util.ULocale.SIMPLIFIED_CHINESE" 替换 "java.util.Locale.CHINA"

比如这样子:

        List<String> list2 = new ArrayList<String>();
        list2.add("网易汽车 - W");
        list2.add("新民汽车网 - X");
        list2.add("钛媒体 - T");
        list2.add("瘾科技 - Y");
        list2.add("昕薇网 - X");
        list2.add("安倍 - A");
        list2.add("中国 - Z");
        list2.add("中心 - Z");
        Comparator<Object> cmp2 = com.ibm.icu.text.Collator.getInstance(com.ibm.icu.util.ULocale.SIMPLIFIED_CHINESE);
        Collections.sort(list2, cmp2);
        for (String str : list2) {
            System.out.println(str);
        }

输出结果:

安倍 - A
钛媒体 - T
网易汽车 - W
昕薇网 - X
新民汽车网 - X
瘾科技 - Y
中国 - Z
中心 - Z

这下子 , 生僻汉字的输出也正确了

数组汉字排序

String[] names = {"王林", "杨宝", "李镇", "刘迪", "刘波"};
        Arrays.sort(names, com.ibm.icu.text.Collator.getInstance(ULocale.SIMPLIFIED_CHINESE));
        System.out.println(Arrays.toString(names));

输出 : [李镇, 刘波, 刘迪, 王林, 杨宝]

 

=====更新于2018-08-22====

最近有个需求,需要 中英数字 混合排序,不是单纯的List<String>,而是根据List集合中对象的某个属性。

直接上代码:


/**
 * @author CYX
 */
public class AppMainTest {

    public final static Comparator comparator = com.ibm.icu.text.Collator.getInstance(com.ibm.icu.util.ULocale.SIMPLIFIED_CHINESE);

    public static void main(String[] args) {

        List<TestObject> testObjects = new ArrayList<TestObject>();
        testObjects.add(new TestObject("A"));
        testObjects.add(new TestObject("网易汽车w - W"));
        testObjects.add(new TestObject("中国 - Z"));
        testObjects.add(new TestObject("B"));
        testObjects.add(new TestObject("新民汽车网 - X"));
        testObjects.add(new TestObject("中心 - Z"));
        testObjects.add(new TestObject("C"));
        testObjects.add(new TestObject("钛媒体 - T"));
        testObjects.add(new TestObject("2-使命召唤"));
        testObjects.add(new TestObject("D"));
        testObjects.add(new TestObject("瘾科技 - Y"));
        testObjects.add(new TestObject("昕薇网 - X"));
        testObjects.add(new TestObject("1"));
        testObjects.add(new TestObject("安倍 - A"));
        testObjects.add(new TestObject("999"));
        testObjects.add(new TestObject("4"));
        testObjects.add(new TestObject("1-英雄联盟"));
        testObjects.add(new TestObject("8"));

        Collections.sort(testObjects, new Comparator<TestObject>() {
            @Override
            public int compare(TestObject o1, TestObject o2) {
                int result = comparator.compare(o1.getName(), o2.getName());
                return result;
            }
        });

        for (TestObject str : testObjects) {
            System.out.println(str);
        }

    }

}

依旧是 沿用上面那个Jar包,输出结果:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值