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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 张晓辉 于 2013-9-11 16:25 编辑
  1. import java.util.*;
  2. class student implements Comparable
  3. {
  4. private String name;
  5. private int age;
  6. student(String name,int age)
  7. {
  8. this.name=name;
  9. this.age=age;
  10. }
  11. public String getName()
  12. {return name;}
  13. public int getAge()
  14. {
  15. return age;
  16. }
  17. public int compareTo(Object obj)
  18. {
  19. if (!(obj instanceof student))
  20. {
  21. throw new RuntimeException("不是学生对象");
  22. }
  23. student s=(student)obj;
  24. if (this.age>s.age)
  25. {
  26. return 1;
  27. }
  28. if (this.age==s.age)
  29. {
  30. return this.name.compareTo(s.name);
  31. }
  32. return -1;
  33. }

  34. }

  35. class treesetlianxi
  36. {
  37. public static void main(String[] args)
  38. {
  39. TreeSet al=new TreeSet();
  40. al.add(new student("jack001",20));
  41. al.add(new student("jack002",20));
  42. al.add(new student("jack001",20));
  43. al.add(new student("jack003",21));
  44. al.add(new student("jack004",10));

  45. Iterator it=al.iterator();
  46. while (it.hasNext())
  47. {
  48. student s=(student)it.next();
  49. System.out.println(s.getName()+"-----"+s.getAge());
  50. }
  51. }
  52. }
复制代码
在student类覆写Comparable接口compareTo()方法中
  1. if (!(obj instanceof student))
  2. {
  3. throw new RuntimeException("不是学生对象");
  4. }
复制代码
不一样的对象,会抛出异常,求个验证过的实例。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

15 个回复

倒序浏览
if (!(obj instanceof student))
满足条件是,传入的obj 不能转student类型,
这个判断你只要满足它就是了,
比如在mian函数中加一句
al.add(new String());
就能进if了

评分

参与人数 1技术分 +2 收起 理由
EYE_SEE_YOU + 2

查看全部评分

回复 使用道具 举报 1 0
斗胆潇洒 发表于 2013-9-11 13:37
if (!(obj instanceof student))
满足条件是,传入的obj 不能转student类型,
这个判断你只要满足它就是了 ...

求指教。。“compareTo”这个函数 是怎么进去的。。我没找到调用的地方
回复 使用道具 举报
。。。。
compareTo是Comparable接口的抽象方法
Student实现时需复写该方法,
每次集合add一个Student对象,都会自动
调用compareTo进行比较
是内部隐式调用的,你只复写就行了
回复 使用道具 举报
周文斌 发表于 2013-9-11 13:44
求指教。。“compareTo”这个函数 是怎么进去的。。我没找到调用的地方

java就这么定义的,TreeSet集合在进行数据存储时要进行比较(以便数据结构存储),在不能比较的情况下,就需要定义自定义比较方法,否则数据存不进去,这个方法是覆写  接口Comparable中compareTo()方法,只要存就会自动调用
回复 使用道具 举报
斗胆潇洒 发表于 2013-9-11 13:37
if (!(obj instanceof student))
满足条件是,传入的obj 不能转student类型,
这个判断你只要满足它就是了 ...

还是没抛出异常啊,我很费解,不是student类型的,怎么可能传进来,
回复 使用道具 举报
本帖最后由 斗胆潇洒 于 2013-9-11 15:25 编辑
周文斌 发表于 2013-9-11 13:44
求指教。。“compareTo”这个函数 是怎么进去的。。我没找到调用的地方

还有,

由于compareTo是Student的复写方法
所以绝对是Student对象 点 调用,
由TreeSet这个容器管理
Student的对象顺序,
如有s1和s2两个Student对象
TreeSet添加s1后
在添加s2时,TreeSet会叫
s2这样做,s2.compareTo(s1),
TreeSet只要返回值,排顺序就行

回复 使用道具 举报
C:\Users\zzb520\Desktop\捕获.JPG
C:\Users\zzb520\Desktop\捕获2.JPG
回复 使用道具 举报
额,我这里验证了才给你发的

捕获.JPG (17.36 KB, 下载次数: 86)

捕获.JPG

捕获2.JPG (17.79 KB, 下载次数: 67)

捕获2.JPG
回复 使用道具 举报
斗胆潇洒 发表于 2013-9-11 14:45
额,我这里验证了才给你发的

为什么只能夹在添加数据的第一行
回复 使用道具 举报
张晓辉 发表于 2013-9-11 14:37
还是没抛出异常啊,我很费解,不是student类型的,怎么可能传进来,

compareTo(Object obj)
中传入的是Object,所以其它类型也能进来啊
然后你那if (!(obj instanceof student))中是加了!的取反符号,
String类型就满足if条件的
回复 使用道具 举报
斗胆潇洒 发表于 2013-9-11 14:51
compareTo(Object obj)
中传入的是Object,所以其它类型也能进来啊
然后你那if (!(obj instanceof studen ...

compareTo()定义在student中,不是student类型的,怎么会进来数据,并且调用此方法?
回复 使用道具 举报
。。。。
compareTo(Object obj)中传入的Object类型
Object是所有类的父类,
所有类都可以向上转型成Object,String也是,
你在if (!(obj instanceof student))下面加一句
System.ou.println("aaaaa");测试句子
就知道进来了不
回复 使用道具 举报
想了想,应该是这么理解:
先在al中添加一个不同类型的对象,当每次添加student类型对象时,都会调用student中的比较方法与集合中对象依次比较,发现不同类型,会抛出异常;发现相同数据不与存储。
如果在集合中先添加有了student对象,此时,再添加其他类型对象时,调用的是其他类型中的比较方法,如果这个类型中没有定义方法,或者定义的方法没有跟student类型比较的代码,JVM就会报错。应该是这样了。
万分感谢各位!
回复 使用道具 举报
张晓辉 发表于 2013-9-11 15:12
想了想,应该是这么理解:
先在al中添加一个不同类型的对象,当每次添加student类型对象时,都会调用studen ...

的确,这样才能解释为什么移动这句话add(String)到不同位置
会报不同异常了,我把我那个例子
s1.compareTo(s2);改成s2.compareTo(s1)了
后添加的s2才是比较的发起者。
这一个小问题,也是受益匪浅啊{:soso_e181:}
回复 使用道具 举报
if (!(obj instanceof student))
如果你的obj对象的类型是Student的话,那么obj instanceof student返回true,if条件表达式不会成立;

obj是任何类型都可以被传入进来的,你可以把obj.getClass.getName();-- 通过反射的方式,你在每次进入到这里的时候,就可以知道你的obj参数的类型到底是什么?

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马