黑马程序员技术交流社区

标题: 为什么007>02 [打印本页]

作者: qjc    时间: 2013-3-21 09:18
标题: 为什么007>02
本帖最后由 qjc 于 2013-3-21 15:23 编辑

import java.util.*;
class TreeSetDemo
{
        public static void main(String[] args)
        {
                TreeSet ts=new TreeSet();
                ts.add(new Student("lisi02",22));
                ts.add(new Student("lisi007",20));
                ts.add(new Student("lisi09",19));
                ts.add(new Student("lisi08",19));
                Iterator it=ts.iterator();
                while(it.hasNext())
                {
                        Student stu=(Student)it.next();
                        System.out.println(stu.getName()+"..."+stu.getAge());
                }
        }
}
class Student implements Comparable//该接口强制让学生具备比较性。
{
        private String name;
        private int age;
        Student(String name,int age)
        {
                this.name=name;
                this.age=age;
        }
        public int compareTo(Object obj)//复写comparable的方法compareTo
        {                        //比什么不知道用obj接收
                return 1;
        }
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
}
编译后是
lisi02...22
lisi007...20
lisi09...19
lisi08...19
*/
在毕老师15-04的按姓名排序中007<02可以理解
为什么在这个程序中007>02
让人纠结
(这个程序的需求是怎么存进去怎么取出来在15-03)
作者: Alex shaw    时间: 2013-3-21 09:26
因为你实现compareable接口重写compareto方法总是返回1,这就此对象永远大于指定对象
然后TreeSet因为底层是二叉树结构,所以第一个元素会放在栈顶,而因为compareto方法重视返回1
所以在存数据的时候,他总是会向二叉树的右边放数据也就是如下结构
第一个元素
       第二个元素
            第三个元素
                第四个元素
因此取得时候也是按照这种顺序来取得
作者: 我手心里的宝    时间: 2013-3-21 09:30
  1.   public int compareTo(Object obj)//复写comparable的方法compareTo
  2.         {                        //比什么不知道用obj接收
  3.                 return 1;
  4.         }
复制代码
在这里,你全让它返1,那他就怎么存进去怎么返回了呀,007是<02的
你这个让他怎么存怎么返回,就不是按照Student的自然数序比较了呀
public int compareTo(Object obj)//复写comparable的方法compareTo
        {               
                         Student s=(Student)obj;
      
                 return 1;
        }

正确代码
  1. Student stu=(Student)obj;
  2.       if(!(obj instanceOf Student))
  3.               throw new RuntimeException();.
  4.       this.name.compareTo(stu.getName());
复制代码

作者: 寇弘禄    时间: 2013-3-21 10:05
TreeSet集合添加元素时会调用compareTo方法,如果compareTo方法返回为正数则表明此对象比原来的对象大,
要存在原来对象的后面,你这个程序覆写了comparTo方法,而且总返回1,所以每添加一个对象都会放在原来对象的后面,
所以就会按照你存入的顺序进行排序。
作者: qintoko    时间: 2013-3-21 11:23
需要重写一下CompareTo的接口,比如说,按您想的,按照姓名排序
  1.         public int compareTo(Object obj)
  2.         {                        
  3.             Student s = (Student) obj;
  4.             
  5.                 return this.name.compareTo(s.name);
  6.         }
复制代码

作者: qjc    时间: 2013-3-21 15:21
我手心里的宝 发表于 2013-3-21 09:30
在这里,你全让它返1,那他就怎么存进去怎么返回了呀,007是


嗯,有道理我有明白了,非常感谢
作者: qjc    时间: 2013-3-21 15:23
肖路宽 发表于 2013-3-21 09:26
因为你实现compareable接口重写compareto方法总是返回1,这就此对象永远大于指定对象
然后TreeSet因为底层 ...

非常感谢!!!!!!!!!!!!!
作者: qjc    时间: 2013-3-21 15:26
寇弘禄 发表于 2013-3-21 10:05
TreeSet集合添加元素时会调用compareTo方法,如果compareTo方法返回为正数则表明此对象比原来的对象大,
要 ...

非常精辟,说到了点子上了,豁然开朗啊




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