我一直在用中文测试字母排序(如果我可以这么称呼的话)。这是Excel对一些示例单词进行排序的方法:
啊<波<词<的<俄<佛<歌<和<及<课<了<馍<呢<票<气<日&LT ;四<特<瓦<喜<以及LT;只
0< 2< 85<<<版本<标记<成员<错误<导出<导航< Excel文件<访问<分类<更改<规则< HTML&lt ;基本<记录<可选<快捷方式<类别<历史记录<密码<目录<内联<内容<讨论<文件<页面<只读
这是Collections.sort(list, simplified_chinese_collator_comparator)
(第一个以粗体显示的冒犯字符)的结果:
啊<波<词<的<俄<佛<歌<和<及<课<了<呢<票<气<日<四&LT ;特<瓦<喜<以及LT;只<的馍
!< @< 0< 0< 0< 0<< 2<<         <<  << ;基本<记录<可选<快捷方式<类别<历史记录<密码<目录<内联<内容<讨论<文件<页面<只读
我对中文一无所知。有谁知道为什么Collator
输出它不同,或者基于什么?
是否还有其他基于语言的排序库?
答案 0 :(得分:3)
Java 6或7中没有Collator,它将按照与第一个样本相同的顺序对中文进行排序。
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();
}
打印
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
答案 1 :(得分:3)
为何与众不同?因为有几种不同的方法可以排序表意字符甚至整个单词。困在我脑海中的是:
还有其他方法,例如Unicode Technical Report #35提到其中一些(更多是巧合,没有必要),但你必须有足够的时间来完成它。
为了回答你的问题,为什么这些排序顺序不同,这只是因为Java包含自己的排序规则而且它不依赖于操作系统的排序规则(就像Excel那样)。这些规则可能有所不同。您可能还想尝试ICU,这是Java中类和规则的来源(通常比JDK领先一步)。