黑马程序员技术交流社区

标题: 关于比较器的小问题。 [打印本页]

作者: CHJ    时间: 2013-9-24 19:53
标题: 关于比较器的小问题。
本帖最后由 CHJ 于 2013-9-24 20:14 编辑
  1. class MyCompare implements Comparator  
  2. {  
  3.     //重写Comparator中的compare方法,按姓名顺序排序  
  4.     public int compare(Object o1,Object o2)  
  5.     {  
  6.         //判断给定对象是否为Student类,否则抛异常  
  7.         if (!((o1 instanceof Student) && (o2 instanceof Student)))  
  8.             throw new RuntimeException("NotSuchTypeException");  
  9.         //将给定对象强转为Student类  
  10.         Student s1 = (Student)o1;  
  11.         Student s2 = (Student)o2;  
  12.         //比较名字,返回数值,相同则比较年龄  
  13.         int n = s1.getName().compareTo(s2.getName());  
  14.         if (n == 0)  
  15.             return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));  
  16.         return n;  
  17.     }  
  18. }  
复制代码
return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
这行,我能写成 return s1.getAge() - s2.getAge(); 么

作者: 张文豪    时间: 2013-9-24 20:06
可以!!
API上如是说:
Integer类中的compareTo(Integer in)方法是在数字上比较两个 Integer 对象。
如果该 Integer 等于 Integer 参数,则返回 0 值;如果该 Integer 在数字上小于 Integer 参数,则返回小于 0 的值;如果 Integer 在数字上大于 Integer 参数,则返回大于 0 的值.
所以写这个return s1.getAge() - s2.getAge();也是正确的。
作者: yting_xmei1129    时间: 2013-9-24 20:08
楼主,你这个问题饿昨天也看见别人提过,饿回答过,貌似找不到了,又得重写了、、、郁闷!

TreeSet 使用这个集合的时候,要了解它的排序原理,TreeSet 的底层数据结构是 二叉树,排序的话,也就是二叉树的排序,如果楼主对二叉树不熟悉的话可以百度下二叉树这个概念。

楼主问的这个 return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
这行,我能写成 return s1.getAge() - s2.getAge(); 么  可以写成 return s1.getAge() - s2.getAge(); 这样。但是这样的话看着有点不专业,我们把它封装到Integer对象里面去之后然后再调用 compartTo方法,这样看着更专业点,我们是面向对象的程序员嘛!

还有楼主实现Comparator 这个借口的话最好使用泛型,你可以少写点判断的代码,看着也更美观,也更好用、、、

希望可以帮到楼主、、、

The you smile until forever 、、、、、、、、、、、、、、、、、、、、、
作者: 梁贺    时间: 2013-9-24 20:11
可以的,
int n = s1.getName().compareTo(s2.getName());  

14.        if (n == 0)  

15.            return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));  

16.        return n;  
这样是在名字一样后,按年龄排序,CompareTo返回的结果你只要看是正数,0,还会负数。所以用
return s1.getAge() - s2.getAge(); 照样能起到这个效果。

作者: CHJ    时间: 2013-9-24 20:13
谢谢各位




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