当前位置: 首页 > 面试题库 >

好奇于CaseInsensitiveComparator的实现[重复]

庄实
2023-03-14
问题内容

在检查的实现(CaseInsensitiveComparator它是的私有内部类)时String,我发现了奇怪的事情。

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;
}

我错过了什么?


问题答案:

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

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

您可以在Unicode网站上的“
案例映射常见问题”中找到更多信息。



 类似资料:
  • 问题内容: hashCode方法的最佳实现中可接受的答案为查找哈希码提供了看似不错的方法。但是我是哈希代码的新手,所以我不太了解该怎么做。 对于1),选择哪个非零值有关系吗?是一样好其他数字,如:黄金? 对于2),我是否将每个值添加到c?如果我有两个字段都是一个,,,等? 我在这堂课上解释得对吗? 问题答案: 该值并不重要,它可以是您想要的任何值。质数将导致值的更好分布,因此首选。 您不必添加它们

  • 本文向大家介绍关于C# Math 处理奇进偶不进的实现代码,包括了关于C# Math 处理奇进偶不进的实现代码的使用技巧和注意事项,需要的朋友参考一下 话说,最近一次系统维护 用JS读取导入Excel中的实验数据,出现被自动四舍五入。后来到客户现场听客户反馈  Excel实验数据要求 奇进偶不进。 关于 奇进偶不进 产生的由来:从统计学的角度,“奇进偶舍”比“四舍五入”要科学,在大量运算时,它使舍

  • 本文向大家介绍基于vue实现一个神奇的动态按钮效果,包括了基于vue实现一个神奇的动态按钮效果的使用技巧和注意事项,需要的朋友参考一下 今天我们将利用vue的条件指令来完成一个简易的动态变色功能按钮 首先我们还是要对vue进行配置,在上篇随笔中有相关下载教学. 然后我们要在html页面上搭建三个简易的按钮,颜色分别为紫,绿和蓝(颜色随意)其代码如下: 这里的@是v-on事件指令,在这里要在三个按钮

  • 问题内容: 我正在使用alix 2d13开发基于Linux的设备。 我已经开发了一个脚本,负责创建映像文件,创建分区,安装引导加载程序(syslinux),内核和initrd,并负责将根文件系统文件放入正确的分区。 配置文件位于tmpfs文件系统上,并在系统启动时由读取驻留在自己分区上的XML文件的软件创建。 我正在寻找一种更新文件系统的方法,并且我考虑了两种解决方案: 固件更新是一个压缩文件,可

  • 本文向大家介绍JS实现为排序好的字符串找出重复行的方法,包括了JS实现为排序好的字符串找出重复行的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS实现为排序好的字符串找出重复行的方法。分享给大家供大家参考,具体如下: 实现这样一个需求,在一个Editplus文档中,有很多行10位的数字,这些数字已经排好序了。 比如: 1234567890 1234567891 1234567892

  • AWS Lambda 上可以运行不同的语言,提供不同语言的运行环境。这也就意味着,它不仅可以跑 Express 来提供一个 RESTful API,它也可以运行各式各样的 Node.js 库,比如说 GraphQL。 GraphQL是一种API查询语言,是一个对自定义类型系统执行查询的服务端运行环境。我们可以编写一个使用 GraphQL 编写一个查询: { me { name }