【问题标题】:compareTo() function in JavaJava 中的 compareTo() 函数
【发布时间】:2020-02-18 12:59:23
【问题描述】:

下面的代码我已经写好了

import java.util.*;
class compare{
    public static void main(String []args){
        String s1="java";
        String s2="javaProgramming";
        System.out.println(s1.compareTo(s2));
    }
}

此代码的输出为 -11。由于 java 中没有终止字符串的字符,“java”中的哪个字符与“javaProgramming”中的“P”进行比较?

【问题讨论】:

  • 如果您对细节感兴趣,还请考虑明智的比较取决于语言,即基于 Locale: Collat​​or。这可以决定像o < od < ö < oe < ... 这样的订单

标签: java string string-comparison


【解决方案1】:

'P' 字符不与第一个 String 中的任何内容进行比较。

它只比较两个字符串的前4个字符,它们彼此相等。

然后返回第一个字符串的长度减去第二个字符串的长度。

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

由于第二个 String 较长,而第一个 String 包含在第二个中,因此返回任何负值都可以,因为较短的 String 应该按字典顺序排在第一位。

【讨论】:

    【解决方案2】:

    让我们看看javadocs 是怎么说的

    按字典顺序比较两个字符串。比较是基于 字符串中每个字符的 Unicode 值。字符序列 由此 String 对象表示的按字典顺序与 由参数字符串表示的字符序列。结果是一个 如果此 String 对象按字典顺序位于 参数字符串。如果此字符串,则结果为正整数 对象按字典顺序跟随参数字符串。结果是 如果字符串相等,则为零; compareTo 返回 0 时正好 equals(Object) 方法将返回 true。

    这是字典顺序的定义。如果两个字符串是 不同,那么它们在某个索引处有不同的字符 这是两个字符串的有效索引,或者它们的长度是 不同,或两者兼而有之。如果他们有一个或多个不同的字符 索引位置,设 k 为最小的此类索引;然后字符串 其在位置 k 处的字符具有较小的值,由下式确定 使用

     this.charAt(k)-anotherString.charAt(k)
    

    如果它们没有不同的索引位置,则较短的 字符串按字典顺序位于较长字符串之前。在这种情况下, compareTo 返回字符串长度的差异——即 是,值:

     this.length()-anotherString.length()
    

    【讨论】:

      【解决方案3】:

      the source code 中可以看出,当达到每个字符串的最小长度时,比较停止。如果通过该点所有字符都相等,则返回长度差。

      【讨论】:

        猜你喜欢
        • 2018-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多