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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  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.         {
  13.                 return name;
  14.         }
  15.         public int getAge()
  16.         {
  17.                 return age;
  18.         }
  19.         /*
  20.         public int compareTo(Object obj)
  21.         {
  22.                 if (!(obj instanceof Student))
  23.                         throw new RuntimeException();
  24.                 Student s=(Student)obj;
  25.                 if(this.age>s.age)
  26.                         return 1;
  27.                 if(this.age==s.age)
  28.                 {
  29.                         return this.name.compareTo (s.name);       
  30.                 };
  31.                 return -1;
  32.         }
  33.         */

  34. }


  35. class  Day1102
  36. {
  37.         public static void main(String[] args)
  38.         {
  39.                 TreeSet ts=new TreeSet();
  40.                 System.out.println(ts);
  41.                 ts.add(new Student("zhangsan01",11));
  42.                 //ts.add(new Student("zhangsan02",12));
  43.                 //ts.add(new Student("zhangsan03",13));
  44.                 //ts.add(new Student("zhangsan04",11));

  45.                 Iterator it=ts.iterator();
  46.                 while (it.hasNext())
  47.                 {
  48.                         Student s=(Student)it.next();
  49.                         System.out.println(s.getName()+"----"+s.getAge());
  50.                 }
  51.                
  52.                
  53.                 System.out.println("Hello World!");
  54.         }
  55. }
复制代码
在毕老师的视频里面,未复写compareTo时,add的第一个对象是可以打印出来的,而我这个却不能。
要是把注释里面的内容释放出来,就可以了。
这是为什么呢?

12 个回复

正序浏览
张向辉 发表于 2013-2-6 18:24
我测试了下这个问题  在1.7版本下出现楼主所述异常   1.6版本正常运行

我确实是1.7版本。谢谢提醒,应该是BUG吧?
回复 使用道具 举报
我测试了下这个问题  在1.7版本下出现楼主所述异常   1.6版本正常运行   
回复 使用道具 举报
陈科宇 发表于 2013-2-5 16:37
朋友,确实对于TreeSet而言,通常的书上讲,存放第一个元素时,即使存放对象没有继承Comparable接口 ...

你能打印的话,难道跟系统有关?我帮楼主试了N次,都抛异常了
回复 使用道具 举报
JavaSE1.7  1.6  1.5 我都试了,确实搞不定,等高手出现吧
回复 使用道具 举报
本帖最后由 杨杨 于 2013-2-5 17:50 编辑

查阅api
api上是这样说的
此实现为基本操作(add、remove 和 contains)提供受保证的 log(n) 时间开销。

注意,如果要正确实现 Set 接口,则 set 维护的顺序(无论是否提供了显式比较器)必须与 equals 一致。(关于与 equals 一致 的精确定义,请参阅 Comparable 或 Comparator。)这是因为 Set 接口是按照 equals 操作定义的,但 TreeSet 实例使用它的 compareTo(或 compare)方法对所有元素进行比较,因此从 set 的观点来看,此方法认为相等的两个元素就是相等的。即使 set 的顺序与 equals 不一致,其行为也是 定义良好的;它只是违背了 Set 接口的常规协定。


Iterator<E> iterator()
          返回在此 set 中的元素上按升序进行迭代的迭代器。
回复 使用道具 举报
李挺 发表于 2013-2-5 17:01
我又试了一次,还是不行,编译能通过,运行时显示
Exception in thread "main" java.lang.ClassCastExcep ...

     重点是我转载资料的最后一句哈,你存进去没什么问题的。你要迭代取出时报了那个错误。如果你还要继续深入问为什么我的电脑可以,这我就很难回答了。这应该跟一个机子的配置的整体环境有关系了。包括你所用的IDE不同,jdk版本等。但是我想这影响并不大。因为这样的尝试只是为了使得基础扎实。实际的开发中,不可能故意突破TreeSet的这个缺口,给自己带来开发上的困难。
回复 使用道具 举报
李挺 发表于 2013-2-5 17:01
我又试了一次,还是不行,编译能通过,运行时显示
Exception in thread "main" java.lang.ClassCastExcep ...

    朋友,我又查阅了资料。你不要在这个问题上纠结了。资料类容如下:
    向TreeSet集合添加元素时,只有第一个元素无须实现Comparable接口,后面添加的所有元素都必须实现
Comparable接口,当然这不是一个好的做法,当试图容TreeSet里取出元素时,就可能引发ClassCastException。
回复 使用道具 举报
陈科宇 发表于 2013-2-5 16:37
朋友,确实对于TreeSet而言,通常的书上讲,存放第一个元素时,即使存放对象没有继承Comparable接口 ...

我又试了一次,还是不行,编译能通过,运行时显示
Exception in thread "main" java.lang.ClassCastException: Student cannot be cast
to java.lang.Comparable
        at java.util.TreeMap.compare(TreeMap.java:1188)
        at java.util.TreeMap.put(TreeMap.java:531)
        at java.util.TreeSet.add(TreeSet.java:255)
        at Day1103.main(Day1103.java:45)
回复 使用道具 举报
陈科宇 发表于 2013-2-5 16:37
朋友,确实对于TreeSet而言,通常的书上讲,存放第一个元素时,即使存放对象没有继承Comparable接口 ...

不会有太大问题的,你再好好检查一下,是不是你漏掉了什么内容。
回复 使用道具 举报
      朋友,确实对于TreeSet而言,通常的书上讲,存放第一个元素时,即使存放对象没有继承Comparable接口也不会有问题的。我完全复制了你的代码,没有任何问题,是可以打印第一个元素的。你应该贴出你的打印内容。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马