首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >中文字母顺序- java.text.Collator

中文字母顺序- java.text.Collator
EN

Stack Overflow用户
提问于 2012-11-08 09:04:32
回答 2查看 2.8K关注 0票数 3

我一直在测试中文字母排序(如果我可以这么说的话)。Excel就是这样对一些示例单词进行排序的:

啊<波<词<的<俄<佛<歌<和<及<课<了<馍<呢<票<气<日<四<特<瓦<喜<以<只 0<2<85

这就是Collections.sort(list, simplified_chinese_collator_comparator) (粗体中的第一个冒犯字符)的结果:

啊<波<词<的<俄<佛<歌<和<及<课<了<呢<票<气<日<四<特<瓦<喜<以<只< !<@<0<2<85

我对中文一无所知。有谁知道为什么Collator输出是不同的,或者它基于什么?

还有其他基于语言的排序库吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-08 20:15:40

为什么不一样?因为有几种不同的方法对表意文字,甚至整个单词进行排序。萦绕在我脑海中的是:

  • 按笔画数
  • 使用拉丁文音译,然后按“自然”顺序排列(当然是按照中文的规则)

还有其他方法,例如Unicode技术报告#35提到了其中的一些方法(更多的是偶然的,不是故意的),但是您必须有足够的时间来研究它。

要回答您的问题,为什么这些排序顺序是不同的,这仅仅是因为Java包含自己的排序规则,并且它不依赖于操作系统的排序规则(就像Excel一样)。这些规则可能不一样。您还可能希望尝试ICU,它是Java中类和规则的来源(通常比JDK领先一步)。

票数 3
EN

Stack Overflow用户

发布于 2012-11-08 09:30:43

Java 6或7中没有排序器,它将按照与第一个示例相同的顺序对中文进行排序。

代码语言:javascript
复制
public static void main(String... args) {
    String text1 = "啊<波<词<的<俄<佛<歌<和<及<课<了<馍<呢<票<气<日<四<特<瓦<喜<以<只";
    findLocaleForSortedOrder(text1);
    String text2 = "啊<波<词<的<俄<佛<歌<和<及<课<了<呢<票<气<日<四<特<瓦<喜<以<只<馍";
    findLocaleForSortedOrder(text2);
}

private static void findLocaleForSortedOrder(String text) {
    System.out.println("For " + text + " found...");
    String[] preSorted = text.split("<");
    for (Locale locale : Collator.getAvailableLocales()) {
        String[] sorted = preSorted.clone();
        Arrays.sort(sorted, Collator.getInstance(locale));
        if (Arrays.equals(preSorted, sorted))
            System.out.println("Locale " + locale + " has the same sorted order");
    }
    System.out.println();
}

版画

代码语言:javascript
复制
For 啊<波<词<的<俄<佛<歌<和<及<课<了<馍<呢<票<气<日<四<特<瓦<喜<以<只 found...

For 啊<波<词<的<俄<佛<歌<和<及<课<了<呢<票<气<日<四<特<瓦<喜<以<只<馍 found...
Locale zh_CN has the same sorted order
Locale zh has the same sorted order
Locale zh_SG has the same sorted order
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13285727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档