黑马程序员技术交流社区

标题: 在TreeSet中的compareTo方法中的一个问题 [打印本页]

作者: 逝去的记忆ヽ    时间: 2012-6-17 18:13
标题: 在TreeSet中的compareTo方法中的一个问题
本帖最后由 逝去的记忆ヽ 于 2012-6-17 20:03 编辑

部分代码和运行结果如下:

public int compareTo(Object obj)
{
  if (!(obj instanceof Student))//比较接受的是不是学生类。
   throw new RuntimeException("不是学生对象。");
  
  Student s = (Student)obj;//进行强制转换 将接受的OBJ转化成student类
  System.out.println(this.age+"--------"+s.age);//在这里我输出的是在TreeSet添加元素时,年龄进行比较。
  if (this.age>s.age)
   return 1;
  if(this.age == s.age)
  {
   return this.name.compareTo(s.name);//在比较字符串时,String类也继承了comparable这个接口。
  }
  return -1;
}
}
class  TreeSetDemo
{
public static void main(String[] args)
{
  TreeSet ts = new TreeSet();
  ts.add(new Student("zhangsan",3));
  ts.add(new Student("lisi",30));
  ts.add(new Student("wangwu",27));
  ts.add(new Student("zhaosi",25));
  for(Iterator it = ts.iterator(); it.hasNext(); )
  {
   Student s = (Student)it.next();
   System.out.println(s.getName()+"--------"+s.getAge());
  }
}



运行结果是:
30--------3
27--------3
27--------30
25--------27
25--------3//那么在这里当年龄25进来的时候应该是和里面有的所有元素进行比较的吧?可是这里就和3进行了比较,30和,27都没有进行比较。这是为什么?我换了好几个数字都不行。求大神指教。
zhangsan-------3
zhaosi--------25
wangwu--------27
lisi--------30

作者: 车风波    时间: 2012-6-17 18:23
本帖最后由 车风波 于 2012-6-17 18:25 编辑

你看错了
25--------27
25--------3  25和 27、3都比较了 。
在25出现前  set里有30 27 3  当25进入后,它先取中间数27 因为27>25  所以就25不用再和30比了吧。然后再和3比,就排除顺序了。
作者: 朝哥    时间: 2012-6-17 19:24
二叉树结构就是,假设第一进来的是A
你进来的时候比A大,那你就不跟比A小的同学比了。
你进来的时候比A小,那你就不跟比A大的同学比了。
作者: 杨朔    时间: 2012-6-17 20:25
TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间大小关系,然后将集合元素按升序排列,这种方式就是自然排序。在比较之前,先跟第一个比较大小,如果它小于第一个数,因为treeSet有自身排序,它就不再跟比它小的数比较。




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