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:
您可以设置Collator的强度属性来确定比较中认为有意义的差异水平。 提供了四个优势:初级,中级,第三级和相同。 语言功能的确切分配与语言环境有关。 例如,在捷克语中,“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