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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© peerless2012 中级黑马   /  2013-6-14 22:45  /  1255 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1 很给力!

查看全部评分

7 个回复

倒序浏览
随便给一个0,1,-1以外的数表示他们不满足同时为Student对象

评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1 赞一个!

查看全部评分

回复 使用道具 举报
孙茜茜 发表于 2013-6-14 23:02
随便给一个0,1,-1以外的数表示他们不满足同时为Student对象

万一传递进来的参数不是Student类型呢?那不就全部返回一样的结果了?
回复 使用道具 举报
peerless2012 发表于 2013-6-15 06:51
万一传递进来的参数不是Student类型呢?那不就全部返回一样的结果了?

反正就设一个数字表示传送的对象不符合要求。
难道还要表达出传错的对象到底是谁吗?
回复 使用道具 举报
我把代码修改成这样了
  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. }
复制代码
回复 使用道具 举报
孙茜茜 发表于 2013-6-15 09:20
反正就设一个数字表示传送的对象不符合要求。
难道还要表达出传错的对象到底是谁吗? ...

我把代码又修改了
顺便说一下,你的名字跟我的一个美女同学的一样。。。。。。。。。。。。。
回复 使用道具 举报
比较器,首选你会定义泛型吧,那么就是定义你需要比较类的比较器
定义了泛型,你还能传入对象错误,程序编译都通过不了
回复 使用道具 举报
王磊 高级黑马 2013-6-16 02:38:21
8#
同楼上,定义泛型,可以强制传入对象为Student,把运行过程中的问题转移到编译上。

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

还是感觉定义泛型比较好。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马