【问题标题】:java CollationKey sorting wrongjava Collat​​ionKey排序错误
【发布时间】:2012-08-10 10:09:44
【问题描述】:

我在比较字符串时遇到问题。我想像这样比较两个“é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。你能告诉我们第一部分代码有什么问题吗?

【问题讨论】:

  • 我在Comparator 及其Swing 的RowSorter 和RowFilter 的实现中遇到了“同样的问题”(我认为这是可以接受的),JTable 的Win1250-2 等式。 ISO 8859-1/2,所有非 ASCII 字符都在末尾排序,例如 e -> é e.i.,抱歉,不需要解决这个问题,因为它是完全可以接受的并且具有逻辑顺序

标签: java compare locale


【解决方案1】:

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

Android javadoc 暗示了它为什么会这样 - 我想 android 中的实现细节与标准 JDK 相似,如果不完全相同的话:

当字符串中的任何位置存在主要或次要差异时,忽略三次差异。

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

似乎符合Unicode Collation Algorithm (UCA):

如果基本字母不同,通常会忽略重音差异。

根据wikipedia article on "ordre alphabetique",这似乎也是在法语中按字母顺序排序的正确方法:

En première analysis, les caractères accentués, de meme que les majuscules, ont le meme rang alphabétique que le caractère fundamental
Si plusieurs mots ont le même rang alphabétique, on tâche de les distinguer entre eux grâce aux majuscules et aux 口音(pour le e, on a l'ordre e, é, è, ê, ë)

在英语中:该顺序最初会忽略重音和大小写 - 如果无法以这种方式排序 2 个单词,则会考虑重音和大小写。

【讨论】:

    【解决方案2】:

    来自JavaDoc:

    您可以设置 Collat​​or 的强度属性来确定在比较中被认为显着的差异水平。提供了四种强度:初级、次级、第三和相同。语言特征的强度的确切分配取决于语言环境。例如,在捷克语中,“e”和“f”被认为是主要差异,而“e”和“ě”是次要差异,“e”和“E”是三次差异,“e”和“e”是相同的.

    尝试不同的优势:

    localeSpecificCollator.setStrength(Collator.PRIMARY);
    

    看看会发生什么。

    【讨论】:

    • @Tichodroma 如果存在主要差异,则不考虑次要/三次差异。
    猜你喜欢
    • 1970-01-01
    • 2014-03-13
    • 2016-07-09
    • 1970-01-01
    • 2023-04-07
    • 2015-09-10
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多