java整理键排序错误

我在比较字符串时遇到了问题。我想比较两个这样的“éd”和“ef”法文文本

Collator localeSpecificCollator = Collator.getInstance(Locale.FRANCE);
CollationKey a = localeSpecificCollator.getCollationKey("éd");
CollationKey b = localeSpecificCollator.getCollationKey("ef");
System.out.println(a.compareTo(b));

这将打印-1 ,但在法语字母e之前é 。 但是,当我们只比较eé就像这样

Collator localeSpecificCollator = Collator.getInstance(Locale.FRANCE);
CollationKey a = localeSpecificCollator.getCollationKey("é");
CollationKey b = localeSpecificCollator.getCollationKey("e");
System.out.println(a.compareTo(b));

结果是1 。 你能告诉我们第一部分代码有什么问题吗?


这似乎是预期的行为, 它似乎也是用法语按字母顺序排序的正确方法。

Android javadoc提供了一个暗示,为什么它的行为如此 - 我想android中的实现细节与标准JDK相似(如果不相同):

当字符串中的任何位置存在主要或次要区别时,第三个区别将被忽略。

换句话说,因为您的2个字符串仅通过查看主要差异(不包括重音符号)可排序,所以整理者不检查其他差异。

它似乎符合Unicode排序算法(UCA):

如果基数不同,重音差异通常会被忽略。

根据维基百科有关“ordre alphabetique”的文章,它似乎也是用法语按字母顺序排序的正确方法:

Enpremièreanalyze,lescaractèresaccentués,demêmeque les majuscules,ont lemêmerangalphabétiqueque lecaractèrefiormental
Si plusieurs mots ont lemêmerangalphabétique,on thetâchede distiner entre euxgrâceaux majuscules et aux accents(pour le e,on l'ordre e,é,è,ê,ë)

用英语:订单最初忽略口音和情况 - 如果2个单词不能按这种方式排序,则会考虑口音和大小写。


从JavaDoc:

您可以设置Collat​​or的强度属性来确定比较中认为有意义的差异水平。 提供了四个优势:初级,中级,第三级和相同。 语言功能的确切分配与语言环境有关。 例如,在捷克语中,“e”和“f”被认为是主要差异,而“e”和“ě”是次要差异,“e”和“E”是第三差异,“e”和“e”是相同的。

尝试不同的优势:

localeSpecificCollator.setStrength(Collator.PRIMARY);

并看看会发生什么。

链接地址: http://www.djcxy.com/p/62601.html

上一篇: java CollationKey sorting wrong

下一篇: Python: code.interact(local=locals()) where stdin/stdout are not available