字符串按字典顺序是什么? 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(如您所知)。
但是,如果你真的想了解为什么在比较 Dog
和 cat
(或任何其他字符串)时 -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 减去两个长度。
在您的示例中,两个单词的首字母不相等,因此您可以比较 D
和 c
,它们分别表示为 68
和 99
。 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?)。
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(如您所知)。
但是,如果你真的想了解为什么在比较 Dog
和 cat
(或任何其他字符串)时 -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 减去两个长度。
在您的示例中,两个单词的首字母不相等,因此您可以比较 D
和 c
,它们分别表示为 68
和 99
。 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?)。