黑马程序员技术交流社区

标题: 关于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)

1.jpg

作者: 朱烈葵    时间: 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