首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对CaseInsensitiveComparator的实现感到好奇

对CaseInsensitiveComparator的实现感到好奇
EN

Stack Overflow用户
提问于 2015-07-29 17:16:00
回答 1查看 708关注 0票数 20

当我检查String的私有内部类CaseInsensitiveComparator的实现时,我发现了一些奇怪的事情。

private static class CaseInsensitiveComparator
        implements Comparator<String>, java.io.Serializable {
    ...
    public int compare(String s1, String s2) {
        int n1 = s1.length();
        int n2 = s2.length();
        int min = Math.min(n1, n2);
        for (int i = 0; i < min; i++) {
            char c1 = s1.charAt(i);
            char c2 = s2.charAt(i);
            if (c1 != c2) {
                c1 = Character.toUpperCase(c1);
                c2 = Character.toUpperCase(c2);
                if (c1 != c2) {
                    c1 = Character.toLowerCase(c1);
                    c2 = Character.toLowerCase(c2);
                    if (c1 != c2) {
                        // No overflow because of numeric promotion
                        return c1 - c2;
                    }
                }
            }
        }
        return n1 - n2;
    }
    ...
}

我很好奇的是:在for循环中,一旦比较了大写字符,为什么还要再次比较小写字符呢?当Character.toUpperCase(c1)Character.toUpperCase(c2)不同时,Character.toLowerCase(c1)Character.toLowerCase(c2)是否可能相等?

难道不能这样简化吗?

public int compare(String s1, String s2) {
    int n1 = s1.length();
    int n2 = s2.length();
    int min = Math.min(n1, n2);
    for (int i = 0; i < min; i++) {
        char c1 = s1.charAt(i);
        char c2 = s2.charAt(i);
        if (c1 != c2) {
            c1 = Character.toUpperCase(c1);
            c2 = Character.toUpperCase(c2);
            if (c1 != c2) {
                // No overflow because of numeric promotion
                return c1 - c2;
            }
        }
    }
    return n1 - n2;
}

我错过了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-29 17:18:45

有些Unicode字符的小写形式不同,但具有相同的大写形式。例如,希腊字母Sigma - it有两种小写形式(σ和ς,仅在单词末尾使用),但只有一种大写形式(Σ)。

我找不到任何相反的例子,但是如果将来发生这样的情况,当前的Java实现已经为此做好了准备。您的Comparator版本肯定能正确处理Sigma案例。

您可以在Unicode网站上的Case Mapping FAQ中找到更多信息。

票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31696168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档