java – 在哪里可以找到一组特定的排序规则用于字符串的等同比较?

我们都知道,使用String的equals()方法进行相等比较将会失败.相反,应该使用Collator,像这样:

// we need to detect User Interface locale somehow
Locale uiLocale = Locale.forLanguageTag("da-DK");
// Setting up collator object
Collator collator = Collator.getInstance(uiLocale);
collator.setStrength(Collator.SECONDARY);
collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
// strings for equality testing
String test1 = "USA lover Grækenland støtte";
String test2 = "USA lover graekenland støtte";
boolean result = collator.equals(test1, test2);

现在,这段代码可以正常工作,除非uiLocale设置为丹麦,否则结果是正确的.在这种情况下会产生错误.我当然明白为什么会发生这种情况:这只是因为方法equals是这样实现的:

return compare(s1, s2) == Collator.Equal;

此方法调用用于排序的方法,并检查字符串是否相同.他们不是,因为丹麦具体的排序规则要求æ被排序后(如果我正确地理解比较方法的结果)ae.然而,这些字符串是完全一样的,这种强大的情况差异和这种兼容性字符(这就是所谓的)应该被视为相等.

为了解决这个问题,我们可以使用RuleBasedCollator和特定的规则,这些规则将适用于平等案例.
最后的问题是:有没有人知道我可以得到这样的具体规则(不仅对丹麦语,而且对于其他语言),以使兼容性字符,连字符等被视为相等(CLDR chart似乎不包含这样或我找不到)?

或者也许我想在这里做一些愚蠢的事情,我应该真的使用简单的UCA进行平等比较(请问任何代码示例)?

我找不到任何现有的丹麦的Collat​​or内置的丹麦地区应该是正确的.我不知道你的假设应该用æ保持,特别是由于丹麦语中的某些外来词(例如“aerofobi”)(我不是丹麦语的人,虽然我说瑞典语).

但是,如果你想将它们整理在一起,看起来你有两种方法可以做到这一点,具体取决于你在哪个上下文中.在某些上下文中,只是替换字符可能是approprite:

String str = "USA lover graekenland støtte";
String sortStr = str.replace("ae", "æ");

另一个,也许更好的选择是您指定的选项;使用RuleBasedCollat​​or.使用javadocs中的示例,这很简单:

String danish = "< a, A < b, B < c, C < d, D < e, E < f, F < g, G < h, H < i, I" +
                "< j, J < k, K < l, L < m, M < n, N < o, O < p, P < q, Q < r, R" +
                "< s, S < t, T < u, U < v, V < w, W < x, X < y, Y < z, Z" +
                "< \u00E6 = ae," +       // Latin letter ae
                "  \u00C6 = AE " +       // Latin letter AE
                "< \u00F8, \u00D8" +     // Latin letter o & O with stroke
                "< \u00E5 = a\u030A," +  // Latin letter a with ring above
                "  \u00C5 = A\u030A;" +  // Latin letter A with ring above
                "  aa, AA";
RuleBasedCollator danishCollator = new RuleBasedCollator(danish);

然后可以使用:

String test1 = "USA lover Grækenland støtte";
String test2 = "USA lover Graekenland støtte";         // note capital 'G'
boolean result = danishCollator.equals(test1, test2);  // true

如果您认为默认的分页器不正确,您可能希望到report a bug.(以前已经有similar bugs).

更新:我用打印的丹麦语百科全书检查了这个.确实是以’ae'(主要来自外语的词语,例如“健美操”)开头的单词,它们不以“æ”开头的(并且因此不等于)单词排序.所以虽然我知道你为什么要在许多情况下对待他们是平等的,但并不是严格的.

http://stackoverflow.com/questions/8389922/where-can-i-find-a-specific-set-of-collation-rules-for-equality-comparison-of-st

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:java – 在哪里可以找到一组特定的排序规则用于字符串的等同比较?