黑马程序员技术交流社区

标题: 自定义比较器时返回值的问题 [打印本页]

作者: peerless2012    时间: 2013-6-14 22:45
标题: 自定义比较器时返回值的问题
本帖最后由 Super_Class 于 2013-6-16 11:57 编辑

自定义比较器时,相同返回0,不等返回一个正整数或者负整数,但是要做健壮性判断的下面这种情况该怎么在判断值为假的时候返回什么样的值?
  1. class CompareScore implements Comparator<Object>{

  2.         @Override
  3.         public int compare(Object o1, Object o2) {
  4.                 // TODO Auto-generated method stub
  5.                 if (o1 instanceof Student&&o2 instanceof Student) {//健壮性判断
  6.                         Student student1=(Student)o1;
  7.                     Student student2=(Student)o2;
  8.                                    //比较过程
  9.                     if (student1.getScore()>student2.getScore()) {
  10.                                 return -1;
  11.                         }else if (student1.getScore()<student2.getScore()) {
  12.                                 return 1;
  13.                         } else{
  14.                                 return 0;
  15.                         }
  16.                 }
  17.                 //return null;//此处应该返回什么样的值?
  18.         }
  19.         
  20. }
复制代码

作者: 孙茜茜    时间: 2013-6-14 23:02
随便给一个0,1,-1以外的数表示他们不满足同时为Student对象
作者: peerless2012    时间: 2013-6-15 06:51
孙茜茜 发表于 2013-6-14 23:02
随便给一个0,1,-1以外的数表示他们不满足同时为Student对象

万一传递进来的参数不是Student类型呢?那不就全部返回一样的结果了?
作者: 孙茜茜    时间: 2013-6-15 09:20
peerless2012 发表于 2013-6-15 06:51
万一传递进来的参数不是Student类型呢?那不就全部返回一样的结果了?

反正就设一个数字表示传送的对象不符合要求。
难道还要表达出传错的对象到底是谁吗?
作者: peerless2012    时间: 2013-6-15 10:31
我把代码修改成这样了
  1. //自定义一个比较器,实现Comparator接口
  2. class CompareScore implements Comparator<Object>{

  3.         //重写compare方法
  4.         @Override
  5.         public int compare(Object o1, Object o2) {
  6.                 // TODO Auto-generated method stub
  7.                 //进行健壮性判断,判断传递来的对象是否是Student类型
  8.                 if (o1 instanceof Student&&o2 instanceof Student) {
  9.                         //如果是Student类型,则对其进行强制转换
  10.                         Student student1=(Student)o1;
  11.                     Student student2=(Student)o2;
  12.                     //第一个对象的分数大于第二个对象的分数,返回-1;小于的话返回1
  13.                     if (student1.getScore()>student2.getScore()) {
  14.                                 return -1;
  15.                         }else if (student1.getScore()<student2.getScore()) {
  16.                                 return 1;
  17.                         } else{
  18.                                 //如果成绩相等,则调用String拥有的比较函数,按字典顺序对名字进行排序,
  19.                                 //并且compareTo 只在方法 equals(Object) 返回 true 时才返回 0。
  20.                                 return student1.getName().compareTo(student2.getName());
  21.                         }
  22.                 }
  23.                 return 0;
  24.         }
  25.        
  26. }
复制代码

作者: peerless2012    时间: 2013-6-15 10:32
孙茜茜 发表于 2013-6-15 09:20
反正就设一个数字表示传送的对象不符合要求。
难道还要表达出传错的对象到底是谁吗? ...

我把代码又修改了
顺便说一下,你的名字跟我的一个美女同学的一样。。。。。。。。。。。。。
作者: 张承富    时间: 2013-6-15 11:52
比较器,首选你会定义泛型吧,那么就是定义你需要比较类的比较器
定义了泛型,你还能传入对象错误,程序编译都通过不了
作者: 王磊    时间: 2013-6-16 02:38
同楼上,定义泛型,可以强制传入对象为Student,把运行过程中的问题转移到编译上。

如果不定义泛型, if (o1 instanceof Student&&o2 instanceof Student)这句建议改成if (!(o1 instanceof Student&&o2 instanceof Student)){}。函数内抛出RuntimeException异常。硬性判断传入参数是否符合学生类,基本作用跟定义泛型差不多。总之就是从主观限制,变成系统的硬性限制。

还是感觉定义泛型比较好。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2