黑马程序员技术交流社区
标题: 关于compareTo的疑惑 [打印本页]
作者: 陈云帆 时间: 2012-7-15 08:42
标题: 关于compareTo的疑惑
本帖最后由 陈云帆 于 2012-7-16 13:11 编辑
在毕老师的讲解String的compareTo时,
String s1="a1c";
String s2="aaa";
System.out.println(s1.compareTo(s2));
s1和s2比较,为什么只比较1和a,而不比较a和c、1和a??
我看API了很长时间,也在网上查了查,都没说到这个问题,
哪位高手能给小弟指点下!
谢谢!!
作者: 陆强强 时间: 2012-7-15 08:51
本帖最后由 陆强强 于 2012-7-15 08:52 编辑
在不复写compareTo方法的情况下
s1.compareTo(s2)比较的顺序是先两个对象的第一个字符进行比较。
String s1="a1c";
String s2="aaa";
发现都是a,再比较第二个字符1和a,分出顺序了就不再往下比了
作者: 咸明月 时间: 2012-7-15 09:41
因为第一个a和a相同不用比,到第二个因为不同,所以只要比较完了就出结果了
作者: 彭超华 时间: 2012-7-15 10:22
要了解String的compareTo方法具体是怎么实现排序功能,必须要看API的源码,帮你找到了compareto的底层源码:
public int compareTo(String anotherString) {
int len1 = count;
int len2 = anotherString.count;
int n = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
if (i == j) {
int k = i;
int lim = n + i;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
} else {
while (n-- != 0) {
char c1 = v1[i++];
char c2 = v2[j++];
if (c1 != c2) {
return c1 - c2;
}
}
}
return len1 - len2;
}
底层是通过把字符串转成字符数组,比较字符数组的元素来实现的,通俗说就是从首字母开始依次比较每个字母,相同就比较下个字母,直到有不同字母或者到短字符串结尾,返回字符个数差(len1 - len2)
作者: 包晗 时间: 2012-7-15 10:24
本帖最后由 包晗 于 2012-7-15 10:37 编辑
String 当中的compareTO方法是按字典顺序比较两个字符串的大小,
基于各个字符的unicode值来进行比较的
compareTo(T o):比较此对象与指定对象的顺序。
如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数
你的程序
String s1="a1c";
String s2="aaa";
System.out.println(s1.compareTo(s2));
s1和s2比较,为什么只比较1和a,而不比较a和c、1和a??
的运行结果是 -48
这是因为在 "aaa" 减去"a1c"
按自然顺序比较的 a比a a比1 a比c;
按照 unicode里的数值运算而得到的
希望能对你有用
-
1.jpg
(2.56 KB, 下载次数: 71)
作者: 朱烈葵 时间: 2012-7-15 11:25
同意 包晗的看法,我觉得也是这样比较的
作者: 党巾水 时间: 2012-7-16 12:45
String s1="a1c";
String s2="aaa";
为了方便说明,我把s2中的a标了颜色。
比较对应字符应该是
s1的a和s2的 红 a 比较。
s1的1和s2的 蓝a 比较。
s1的c和s2的 黄 a 比较。
但是例子中比到第二位1和 蓝 a时就不同了,所以停止比较并返回结果。
作者: 陈云帆 时间: 2012-7-16 13:10
彭超华 发表于 2012-7-15 10:22 
要了解String的compareTo方法具体是怎么实现排序功能,必须要看API的源码,帮你找到了compareto的底层源码 ...
谢谢,有些懂了,源码规定这么比的,
作者: 陈云帆 时间: 2012-7-16 13:11
谢谢各位的回答,
作者: 杨康 时间: 2012-7-16 13:39
该比较是自然排序,只要某一位上的数据比较得到结果,就不需要再往下比较。
| 欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |