-1

"xyz".compareTo("abc")--->23

"abc".compareTo("xyz")--->-23

我需要知道它是如何计算这个数值的。这个值的用途是什么

4

5 回答 5

7

请查看源代码并浏览文档,其中说按字典顺序比较两个字符串。比较基于字符串中每个字符的 Unicode 值。

public int compareTo(String anotherString) {
    int len1 = value.length;
    int len2 = anotherString.value.length;
    int lim = Math.min(len1, len2);
    char v1[] = value;
    char v2[] = anotherString.value;

    int k = 0;
    while (k < lim) {
        char c1 = v1[k];
        char c2 = v2[k];
        if (c1 != c2) {
            return c1 - c2;
        }
        k++;
    }
    return len1 - len2;
}

情况1: "xyz".compareTo("abc")

应返回'x'-'a'等于 23。

案例二: "abc".compareTo("xyz")

应返回'a'-'x'等于 -23。

于 2013-05-01T08:06:01.493 回答
3

值的大小无关紧要,通常不应依赖。的确切值已记录在案String.compareTo,但我认为这本身就是一个设计错误。这不像可以以任何明智的方式使用差异,并且它限制了以后仍然可以遵守合同Comparable但具有不同细节的实现:((完全指定的事实String.hashCode是一个类似的错误。)

对于排序比较而言,重要的是值是小于 0、0 还是大于 0。

来自以下文档Comparable.compareTo

返回:
负整数、零或正整数,因为此对象小于、等于或大于指定对象。

于 2013-05-01T08:07:42.290 回答
0

compareTo 值仅指结果的符号 + 表示大于参数 xyz > abc - 表示小于参数 abc < xyz 0 表示它们相等。

由于字符串包含字符,字符串的 compareTo 使用字典顺序并将其转换为数字,但这只是实现。

于 2013-05-01T08:49:18.537 回答
0

"xyz".compareTo("abc")--->23

这需要返回一个正整数。在这种情况下,它返回 'x'-'a',即 23。

"abc".compareTo("xyz")--->-23

这是返回负整数所必需的。在这种情况下,它返回 'a'-'x',即 -23。

相似地

"abc".compareTo("abc")---> 0

这需要返回零。在这种情况下,它将返回 'a'-'a',它是零。

您可以看到使用减法是实现合约的最简单方法。

于 2013-05-01T10:37:42.287 回答
0

除了其他答案:如果您想执行本地敏感字符串比较而不是按字典顺序进行比较(例如,对于自然语言文本),请查看Collat​​orCollat​​ionKey

于 2013-05-01T08:22:54.650 回答