Java排序含有中文的字符串

icu4j

ICU首先是由Taligent公司开发的,Taligent公司被合并为IBM公司全球化认证中心的Unicode研究组后,ICU由IBM和开源组织合作继续开发。开始ICU只有Java平台的版本,后来这个平台下的ICU类被吸纳入SUN公司开发的JDK1.1,并在JDK以后的版本中不断改进。C++和C平台下的ICU是由JAVA平台下的ICU移植过来的,移植过的版本被称为ICU4C,来支持这C/C++两个平台下的国际化应用。ICU4J和ICU4C区别不大,但由于ICU4C是开源的,并且紧密跟进Unicode标准,ICU4C支持的Unicode标准总是最新的;同时,因为JAVA平台的ICU4J的发布需要和JDK绑定,ICU4C支持Unicode标准改变的速度要比ICU4J快的多。


ICU的功能主要有:

代码页转换: 对文本数据进行Unicode、几乎任何其他字符集或编码的相互转换。ICU的转化表基于IBM过去几十年收集的字符集数据,在世界各地都是最完整的。
排序规则(Collation): 根据特定语言、区域或国家的管理和标准比较字数串。ICU的排序规则基于Unicode排序规则算法加上来自公共区域性数据仓库(Common locale data repository)的区域特定比较规则。
格式化: 根据所选区域设置的惯例,实现对数字、货币、时间、日期、和利率的格式化。包括将月和日名称转换成所选语言、选择适当缩写、正确对字段进行排序等。这些数据也取自公共区域性数据仓库。
时间计算: 在传统格里历基础上提供多种历法。提供一整套时区计算API。
Unicode支持: ICU紧密跟进Unicode标准,通过它可以很容易地访问Unicode标准制定的很多Unicode字符属性、Unicode规范化、大小写转换和其他基础操作。
正则表达式: ICU的正则表达式全面支持Unicode并且性能极具竞争力。
Bidi: 支持不同文字书写顺序混合文字(例如从左到右书写的英语,或者从右到左书写的阿拉伯文和希伯来文)的处理。
文本边界: 在一段文本内定位词、句或段落位置、或标识最适合显示文本的自动换行位置。

Maven依赖

<dependency>
    <groupId>com.ibm.icu</groupId>
    <artifactId>icu4j</artifactId>
    <version>68.2</version>
</dependency>

测试

@Test
    public void test() {
        List<String> list = new ArrayList<>();
        list.add("中国");
        list.add("中东");
        list.add("北京");
        list.add("河北");
        list.add("石家庄");
        list.add("一年");
        list.add("两年半");
        list.add("安全帽");
        list.add("钛媒体");
        System.out.println("排序前:" + list);
        com.ibm.icu.text.Collator comIbmIcuTextCollator = com.ibm.icu.text.Collator.getInstance();
        list.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return comIbmIcuTextCollator.compare(o1, o2);
            }
        });
        System.out.println("排序后:" + list);
    }
    //排序前:[中国, 中东, 北京, 河北, 石家庄, 一年, 两年半, 安全帽, 钛媒体]
    //排序后:[安全帽, 北京, 河北, 两年半, 石家庄, 钛媒体, 一年, 中东, 中国]

注意:  对于Collator类java本人也有,而且也支持排序,但是会有问题,我们可以试试java,text下的Collator的效果.

@Test
    public void test() {
        List<String> list = new ArrayList<>();
        list.add("中国");
        list.add("中东");
        list.add("北京");
        list.add("河北");
        list.add("石家庄");
        list.add("一年");
        list.add("两年半");
        list.add("安全帽");
        list.add("钛媒体");
        System.out.println("排序前:" + list);
        Collator instance = Collator.getInstance();
        list.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return instance.compare(o1, o2);
            }
        });
        System.out.println("排序后:" + list);
    }
    //排序前:[中国, 中东, 北京, 河北, 石家庄, 一年, 两年半, 安全帽, 钛媒体]
    //排序后:[安全帽, 北京, 河北, 两年半, 石家庄, 一年, 中东, 中国, 钛媒体]

同样的集合排序出现了问题,"钛媒体"这个词应该在前面才对,这是因为java.text.Collator使用的顺序是其字符串包含的字符在指定语言当中的顺序(譬如中文汉字编著入库的顺序),是locale敏感的,为此不能做到任何环境下所有字符统一处理.所以推荐使用icu4j下的Collator来进行排序.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值