Java中的compareTo()方法比较两个字符串“按字典顺序”。有人可以简单解释一下字典比较在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);
答案 0 :(得分:2)
返回的值并不重要,因为compareTo
合约要返回负数,正数或0(正如您所知)。
但是,如果您真的想了解在将-31
与Dog
(或任何其他字符串)进行比较时返回cat
的原因,那么您可以直接在{{中查看该方法1}} class:
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;
}
k++;
}
return len1 - len2;
}
是支持字符串的value
数组。
char
那么这个方法是如何进行的?
private final char value[];
中检索两个字符串长度的最小值。lim
可以表示为char
值(取其ascii值)并且已经订购。因此,如果第二个字符“高于”第二个字符,那么当减去负数时将返回第一个字符。如果第二个字符“低于”第一个字符,则返回正数。如果两者都是等于,则返回0。 在您的示例中,两个单词的首字母不相等,因此您可以将int
与D
进行比较,这些c
分别表示为68
和99
。减去99到68,你得到-31。
所以回答这个问题:
这是否意味着返回的int是离开的位置数 如果字符串按字母顺序排序,则字符串彼此形成 像字典?
不,它实际上是两个不匹配的char的ascii值之间的差异或两个长度的差异。
此外,该方法如何处理区分大小写?小写 在大写之前排在第一位的字母?有这个图表吗?
如果您想在比较时忽略这种情况,可以使用String#compareToIgnoreCase
。
您还可以检查this chart是否有ascii值(大写和小写)。
答案 1 :(得分:1)
我发现Wikipedia's Definition of Lexicographical order在回答您的问题时非常有用。
以简单的方式,比较是进行字母比较的数字结果。在字母比较中,我们比较构成序列的有序字母集(通常是单词或字符串)。如果两者相等则返回值为0,并且&lt;或者&gt;取决于哪个值按字母顺序排列在另一个之前或之后。
列出一个单词:
如果我们比较这些,我们采取每个的第一个字符并查看。当我们比较“猫”时和'&#39; dog&#39;,我们采取第一个角色&#39; c&#39;并且&#39; d&#39;并比较它们。在数字代码中,简单(不一定是最好的)方法是将它们转换为数值并从另一个值中减去一个值。如果它们相同,则它将等于0,并且我们将比较每个中的下一个字符。如果它们不同,那么我们知道一个是按字母顺序排列的(按字母顺序排列)。
不需要返回值 以获得任何有见地的信息。这就是为什么唯一具有任何意义的值是&lt; 0,== 0和&gt; 0 的原因。
关于套管,这是一个实施细节 - 有一些比较器会考虑大写&#39; A&#39;与小写字母相同&#39; a&#39;并且有比较器不具备,因为它们具有不同的数值。 (见:How to sort alphabetically while ignoring case sensitive?)。