我一直在测试中文字母排序(如果我可以这么说的话)。Excel就是这样对一些示例单词进行排序的:
啊<波<词<的<俄<佛<歌<和<及<课<了<馍<呢<票<气<日<四<特<瓦<喜<以<只 0<2<85
这就是Collections.sort(list, simplified_chinese_collator_comparator) (粗体中的第一个冒犯字符)的结果:
啊<波<词<的<俄<佛<歌<和<及<课<了<呢<票<气<日<四<特<瓦<喜<以<只<馍 !<@<0<2<85
我对中文一无所知。有谁知道为什么Collator输出是不同的,或者它基于什么?
还有其他基于语言的排序库吗?
发布于 2012-11-08 20:15:40
为什么不一样?因为有几种不同的方法对表意文字,甚至整个单词进行排序。萦绕在我脑海中的是:
还有其他方法,例如Unicode技术报告#35提到了其中的一些方法(更多的是偶然的,不是故意的),但是您必须有足够的时间来研究它。
要回答您的问题,为什么这些排序顺序是不同的,这仅仅是因为Java包含自己的排序规则,并且它不依赖于操作系统的排序规则(就像Excel一样)。这些规则可能不一样。您还可能希望尝试ICU,它是Java中类和规则的来源(通常比JDK领先一步)。
发布于 2012-11-08 09:30:43
Java 6或7中没有排序器,它将按照与第一个示例相同的顺序对中文进行排序。
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 orderhttps://stackoverflow.com/questions/13285727
复制相似问题