Java:将字符串与"-"进行比较(破折号)



我是Java的初学者,可能我在问一些显而易见的事情,但无论如何。

根据 Java.Lang.String compareTo() 方法说明:

比较基于字符串中每个字符的 Unicode 值。

我正在比较字符串

    public void compareString() {
    String str1 = "test-2014";
    String str2 = "test195519-9022c72bc161";
    String str3 = "test200101-ee4d99b1492c";
    String str4 = "test212941-884e3f03fe1e";
    System.out.println(str1.compareTo(str2));
    System.out.println(str1.compareTo(str3));
    System.out.println(str1.compareTo(str4));
}
------------ OUTPUT -----------
-4
-5
-5

我希望输出在所有三种情况下都是相同的,因为每种情况下 (1, 2, 2) 中第五个字符的 Unicode 值都大于"str1"(-) 中的第五个字符。

你能解释一下为什么会这样吗?

认为

返回哪个负数并不重要。 这里唯一重要的信息是compareTo返回的标志。 它是否返回-1-4-5-1000000都无关紧要。 唯一要得出结论的是,str1 小于其他每个字符串。

来自 Javadocs 中ComparablecompareTo方法:

将此对象

与指定的对象进行比较以进行排序。返回负整数、零或正整数,因为此对象小于、等于或大于指定对象。

你期望以下内容

我希望在所有三种情况下输出都是相同的,因为 在每种情况下 (1, 2, 2) 中第五个字符的 Unicode 值都大于 "str1"(-)中的第五个字符。

这种期望是错误的。- 的 unicode 值小于其他值。

运行此测试

System.out.println((int) '-');
System.out.println((int) '1');
System.out.println((int) '2');

它将打印

45
49
50

45 小于 49,因此该方法将返回负值。正如javadoc所说

如果参数字符串等于此字符串,则值 0;一个值 如果此字符串在字典顺序上小于字符串,则小于 0 论点;如果此字符串是 字典顺序大于字符串参数。

作为参考,Java Oracle 7 中String#compareTo(String)的实现

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; // important!!!!
        }
        k++;
    }
    return len1 - len2;
}

没有任何地方说compareTo()应该返回不匹配的第一个字符的索引。这是您的错误假设。唯一保证的结果是其返回值将为负、正或零,具体取决于两个字符串的字典顺序比较。

在这 3 种可能性中的每一种中,返回的实际数字(-5 对 -1 对 -3495582)取决于实现(实现可以自由返回它想要的任何内容,只要它是负数),你不应该对此做出进一步的假设。

相关内容

  • 没有找到相关文章