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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 摄影勾魂 于 2013-11-22 13:54 编辑
  1. import java.util.*;
  2. public class TestCompareTo implements Comparable
  3. {
  4.         public int compareTo(Object o)
  5.         {
  6.                 return 1;
  7.         }
  8.         public static void main(String[] args)
  9.         {
  10.                 TreeSet set = new TreeSet();
  11.                 set.add(new Integer(9));
  12.                 set.add(new Integer(2));
  13.                 set.add(new Integer(15));
  14.                 set.add(new Integer(89));
  15.                 set.add(new Integer(92));
  16.                 set.add(new Integer(223));
  17.                 set.add(new TestCompareTo());//比所有已存在对象都大
  18.                 set.add(new TestCompareTo());
  19.                 set.add(new Integer(-1));
  20.                 set.add(new Integer(2));
  21.                 set.add(new Integer(8));
  22.                 set.add(new Integer(9));
  23.                 set.add(new Integer(14));
  24.                 set.add(new Integer(19));
  25.                 //set.add(new Integer(225));  //会和 TestComparator 对象比较,因无法比较所以抛异常
  26.                 set.add(new Integer(120));
  27.                 System.out.println(set);
  28.         }
  29. }
复制代码
运行结果正常,如图:
可是当我注释掉set.add(new Integer(89));或者set.add(new Integer(92));的时候它就抛异常,如图:
当把这两行代码同时注释掉的时候也不会出问题,就是说这两行代码只有同时存在或同时不存在的时候才正常,只有一个存在时就抛异常。
不管是注释掉这两行中的哪一行,它怎么就出问题了呢?运行到第26行:set.add(new Integer(120)); 的时候,因为new Integer(223)之前的也都是有序的,它在new Integer(223)之前就已经找到了它的位置,也就是说它根本就无法越过new Integer(223)这个对象而去和放在随后的new TestCompareTo()比较大小啊,那又怎么会出现TestCompareTo无法转换为Integer的异常呢?求指教

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 好学上进,吾辈楷模。

查看全部评分

3 个回复

倒序浏览
找到问题的原因了------平衡二叉查找树算法(红黑树)。TreeSet是根据红黑树算法对集合中的元素排序的

点评

FFF
这个,自问自答,可不太好~~!!!  发表于 2013-11-22 00:38
回复 使用道具 举报
本帖最后由 摄影勾魂 于 2013-11-22 14:14 编辑
摄影勾魂 发表于 2013-11-21 22:57
找到问题的原因了------平衡二叉查找树算法(红黑树)。TreeSet是根据红黑树算法对集合中的元素排序的 ...

       做练习的时候,无意间发现存在这么一个问题,连Integer源码中的compareTo()也查看了,怎么也找不到原因。无奈呀,就赶紧来论坛问问,坐等半小时,有20多个人浏览就是没人回答,着急啊。只知道TreeSet是用二叉树排序的方法对集合中元素排序的,怎么就跟我想的不一样呢,我就自己编了两个类,实现Comparable接口,重写compareTo(),使TreeSet元素在调用compareTo()的时候能看到是和哪个已存在的元素在进行比较,是按什么顺序比较的……,结果出来一看,还真和我以为的二叉树排序不一样,在比较的时候有些已存在的元素会被跳过(在创建这种二叉树的过程中会自行调整树的结构)。这下问题就简单了,我就搜了下TreeSet的排序,就找到红黑树查找法了。以前看书的时候都没太注意这方面的细节,红黑树是高级数据结构的内容,一般的介绍数据结构书籍会略过或者作为选学。还是自己看的书少,知识面太窄;再一个就是不够细心。今后还得再努力才是啊!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马