字符串按字典顺序是什么? Java

What is string lexicographically? Java

Java 中的 compareTo() 方法比较两个字符串 "lexicographically"。有人可以简单地解释一下 java 中的词典比较是如何工作的吗?

我发现 this post 解释了 <0 、==0 和 >0 的三种情况;然而,我还是一头雾水...

这是否意味着如果要像字典一样按字母顺序排序,则返回的 int 是字符串彼此相隔的位置数?

另外,该方法是如何区分大小写的?小写字母排在大写字母之前吗?有图表吗?

例如,下面的代码产生 -31 的输出。这是否意味着字符串 Dog 与字符串 cat 相距 -31 位?

public static void main(String[] args) {
     Scanner keyboard = new Scanner(System.in);   

     String str1 = "Dog";

     String str2 = "cat";

     int result = str1.compareTo(str2);
     System.out.println(result);

值 returned 并不重要,因为 compareTo 合同是 return 负数、正数或 0(如您所知)。

但是,如果你真的想了解为什么在比较 Dogcat(或任何其他字符串)时 -31 被 returned,那么你可以简单地看一下直接在 String class 中的方法:

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

请记住 value 是支持字符串的 char 数组。

private final char value[];

那么这个方法是如何进行的呢?

  • 您在变量 lim 中检索两个字符串长度的最小值。
  • 您创建了两个字符串字符数组的副本。
  • 你遍历每个字符(验证它们是否相等)直到达到最低限制。
  • 如果同一索引处的两个字符不相等,则return将第二个减去第一个的结果。 char 可以表示为 int 值(采用它们的 ascii 值)并且已经订购。因此,当减去一个负数时,如果第二个字符是 "higher",那么第一个字符将被 returned。如果第二个字符是 "lower" 然后是第一个字符,则正数将被 returned。如果两者相等,0 将被 returned。
  • 如果在循环最小字符串长度时所有字符都相等,则您 return 减去两个长度。

在您的示例中,两个单词的首字母不相等,因此您可以比较 Dc,它们分别表示为 6899。 99 减去 68 得到 -31。

所以要回答这个问题:

Does this mean that the int returned is the number of places away the strings are form one another if they were to be sorted alphabetically like a dictionary?

不是,它实际上是两个不匹配的字符的ascii值之间的差异或两个长度的差异。

Also, how does the method deal with case sensitivity? Are lower case letters first in line before uppercase? Is there a chart for this?

如果想比较时忽略大小写,可以使用String#compareToIgnoreCase.

您还可以检查 this chart 的 ascii 值(大写和小写)。

我发现 Wikipedia's Definition of Lexicographical order 对回答您的问题非常有用。

以简单的方式,比较是进行字母比较的数字结果。在字母比较中,我们比较组成序列(通常是单词或字符串)的有序字母集。如果两者相等,return 值将为 0,并且 < 或 > 取决于哪个值按字母顺序在另一个之前或之后。

获取单词列表:

  • 动物
  • 土豚

如果我们比较这些,我们会取每个的第一个字符并查看。当我们比较'cat'和'dog'时,我们取第一个字符'c'和'd'进行比较。在代码中,最简单(不一定是最好)的方法是将它们转换为数值,然后从另一个值中减去一个值。如果它们相同,这将等于 0,我们将去比较每个中的下一个字符。如果它们不同,那么我们就知道一个是按字典顺序(字母顺序)在另一个之后。

return 值 不需要 来获得任何有见地的信息。这就是为什么唯一有意义的值是 <0、==0 和 >0

关于大小写,这是一个实现细节 - 有些比较器会将大写字母 'A' 视为与小写字母 'a' 相同,并且有些比较器不会',因为它们具有不同的数值。 (参见:How to sort alphabetically while ignoring case sensitive?)。