黑马程序员技术交流社区

标题: 关于treeset集合的一个问题 [打印本页]

作者: 蔡建荣    时间: 2012-7-23 16:06
标题: 关于treeset集合的一个问题
本帖最后由 蔡建荣 于 2012-7-23 23:46 编辑

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));
                //ts.add(new Student("lisi007",20));
                //ts.add(new Student("lisi01",40));

                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)
        {

                //return 0;
               
                if(!(obj instanceof Student))
                        throw new RuntimeException("不是学生对象");
                Student s = (Student)obj;

                System.out.println(this.name+"....compareto....."+s.name);
                if(this.age>s.age)
                        return 1;
                if(this.age==s.age)
                {
                        return this.name.compareTo(s.name);
                }
                return -1;
                /**/
        }

        public String getName()
        {
                return name;

        }
        public int getAge()
        {
                return age;
        }
}



我知道treeset 的使用需要compareTo()让其有排序..    我的问题是 在代码中为什么class student 中的 compareTo()方法被调用了? 哪个语句?
作者: 王璐    时间: 2012-7-23 16:21


作者: 蔡建荣    时间: 2012-7-23 16:27
王璐 发表于 2012-7-23 16:21

后进入的元素为什么能调用比较? 语句在哪或者是基于什么原理? 我就是困惑在这里~ 谢谢你
作者: 王璐    时间: 2012-7-23 16:45
蔡建荣 发表于 2012-7-23 16:27
后进入的元素为什么能调用比较? 语句在哪或者是基于什么原理? 我就是困惑在这里~ 谢谢你 ...

关于这个,毕老师说是系统底层会去调用
作者: 左建飞    时间: 2012-7-23 16:46
add
public boolean add(E e)将指定的元素添加到此 set(如果该元素尚未存在于 set 中)。更确切地讲,如果该 set 不包含满足 (e==null ? e2==null : e.equals(e2)) 的元素 e2,则将指定元素 e 添加到此 set 中。如果此 set 已经包含这样的元素,则该调用不改变此 set 并返回 false。

以上是jdk1.6对Set类的add()方法的说明,其中的equals是否为真就是由compareTo()的返回值决定的。
也就是说add()方法的定义中就调用了compareTo()方法。
所以说调用add()方法时,会先判断是否有元素,如果有元素,那么add()方法就调用compareTo()方法比较是否相同。
作者: 乐峰    时间: 2012-7-23 16:53
TreeSet集合往里面添加Student类的对象,必须要具有比较性,不然会出现异常。其中一个方法是要求Student类必须继承Comparable接口,去复写该接口的compareTo()方法,让Student类里面的对象具有比较性,这样才能在TreeSet里面进行排序。排序的顺序是第一个元素进入集合后并不比较,之后陆续进入放入元素进行循环比较,最后将比较结果输出。
作者: 蔡建荣    时间: 2012-7-23 16:59
聂峰 发表于 2012-7-23 16:53
TreeSet集合往里面添加Student类的对象,必须要具有比较性,不然会出现异常。其中一个方法是要求Student类 ...

在复写了接口中的compareTo()方法后 在new 出student类就一定会执行它所复写的方法吗?

implements 接口有没有这样子规定?    我对这个有点不大熟..

麻烦了....
作者: 蔡建荣    时间: 2012-7-23 17:02
左建飞 发表于 2012-7-23 16:46
add
public boolean add(E e)将指定的元素添加到此 set(如果该元素尚未存在于 set 中)。更确切地讲,如果 ...

你的意思是说  在调用add()方法的时候  add()本身会再调用compareTo()方法是吗?

这两个不是独立的方法吗?  
作者: 乐峰    时间: 2012-7-23 19:41
蔡建荣 发表于 2012-7-23 16:59
在复写了接口中的compareTo()方法后 在new 出student类就一定会执行它所复写的方法吗?

implements 接口 ...

一定会执行这个方法的




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