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);
解决方法:
返回的值并不重要,因为compareTo合同将返回负,正或0(您已经知道).
但是,如果您真的想了解将Dog与cat(或任何其他字符串)进行比较时为什么返回-31的原因,则可以直接在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;
}
请记住,值是支持字符串的char数组.
private final char value[];
那么这种方法如何进行呢?
>您可以在变量lim中检索两个字符串长度的最小值.
>您将创建两个字符串char数组的副本.
>循环遍历每个字符(验证它们是否相等),直到达到最低限制.
>如果同一索引处的两个字符不相等,则将第二个字符减去第一个字符的结果返回.字符可以表示为int值(采用其ascii值),并且已经被排序.因此,如果第二个字符比第一个字符“高”,则在减去负数时将返回负数.如果第二个字符比第一个字符“低”,将返回一个正数.如果两者相等,将返回0.
>如果循环最小字符串长度时所有字符均相等,则返回两个长度的减法.
在您的示例中,两个单词的首字母不相等,因此您将D与c进行比较,将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?
不,实际上是两个不匹配的char的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值(大写和小写).