A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cqdouble 中级黑马   /  2014-6-1 17:32  /  1975 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class StuNameComparator implements Comparator<Student>
  2. {
  3.         public int compare(Student s1,Student s2)
  4.         {
  5.                 int num = s1.getName().compareTo(s2.getName());
  6.                 if(num==0)
  7.                         return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));

  8.                 return num;
  9.         }
  10. }
复制代码

上面的int num就没有new一个对象,而下面的return语句要new了一个对象呢?

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

9 个回复

倒序浏览
compareTo方法是 比较对象与指定对象的顺序。
上面那个s1和s2是Student对象,而s1.getage()是基本数据类型int,要用Integer封装成对象。

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

回复 使用道具 举报
compareTo是一个方法
只有对象(或者类名)才可以调用方法
int作为基本数据类型是不可以调用方法的,所以需要用new Intege来封装成一个对象

那么为什么getName却可以调用方法呢?
因为getName得到的返回值是String

String不是基本数据类型,而是一个类
例如:
String s = "Hello world";int i = 0;

这里的s是String类创建的一个对象,不是基本数据类型


和i完全不是一个级别

所以,getName可以直接调用compareTo方法来进行比较
而getAge不可以

另,int类型可以不用compareTo来比较
可以直接返回差值:return s1.getAge()-s2.getAge();

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

回复 使用道具 举报
上面的num是得到的一个结果, 而线面的对象是一个integer对象,你需要使用这个对象身上的方法,所以你需要创建一个对象,如果这个类是静态工具类,那么你也可以不用创建对象,你直接类名.方法名就可以调用了
回复 使用道具 举报
123_yaya 来自手机 中级黑马 2014-6-1 23:59:18
报纸
123_yaya 发表于 2014-6-1 17:43
compareTo方法是 比较对象与指定对象的顺序。
上面那个s1和s2是Student对象,而s1.getage()是基本数据类型i ...

没看清是.getName,二楼正解。
回复 使用道具 举报
一般都是这样写的,先用> ==与比较age会返回一个值的,在用对象点compareTo比较,楼上说的对,实现Comparator接口,让对象具有比较的这个方法,封装成Integer对象,应该不是比较属性的值了,应该是对象的引用吧

class StuNameComparator  implements Comparator<Student>{
               
                public int compare(Student s1,Student s2){
                       
                                        if(s1.getAge()>s2.getAge()){
                                               
                                                 return 1;
                                        }
                                        if(s1.getAge()==s2.getAge()){
                                               
                                                return s1.getName().compareTo(s2.getName());
                                        }
                        
                        return -1;
                }
        }
          
回复 使用道具 举报
李小然 发表于 2014-6-1 23:16
compareTo是一个方法
只有对象(或者类名)才可以调用方法
int作为基本数据类型是不可以调用方法的,所以需 ...

好像有点说的不是很好,compareTo方法返回的是0和1或者-1,本身就是一个int的值,为什么说int不可以呢,
int不是一个对象是真的,也不会有compareTo比较方法,s1.getName().compareTo(s2.getName());比较后
返回是int的值,不是String的,compareTo比较原理是,根据字符,或字母在字符编码中的排位顺序,s1小于s2是-1,等于是0,大于是1
回复 使用道具 举报
总结一下吧,通过这个例子,可以看出,compareTo()方法两边进行比较的内容必须是对象类型。getName()的返回值类型是String类型,其实就是一个对象,所以可以直接进行比较,getAge()的返回值类型是int型,要包装成对象,就有了装箱操作。另外,API文档中Integer是comparable的实现类
回复 使用道具 举报
chenzhiyuan 发表于 2014-6-2 01:37
好像有点说的不是很好,compareTo方法返回的是0和1或者-1,本身就是一个int的值,为什么说int不可以呢,
...

你木有看明白我在说什么哦。
另外,compareTo不是一定要返回-1、0、1的
只要相应的正、负、零即可。
回复 使用道具 举报
李小然 发表于 2014-6-2 10:18
你木有看明白我在说什么哦。
另外,compareTo不是一定要返回-1、0、1的
只要相应的正、负、零即可。 ...

奥,负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。是API的原意,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马