黑马程序员技术交流社区

标题: treeSet集合可以加入的元素是不是必须实现实现Comparable? [打印本页]

作者: 李哲    时间: 2012-5-16 09:08
标题: treeSet集合可以加入的元素是不是必须实现实现Comparable?
本帖最后由 李哲 于 2012-5-16 10:03 编辑

如题。

作者: 李啸    时间: 2012-5-16 09:18
这个不是必须的 也可以定义一个比较器在比较器重自定义比较方法 然后将比较器对象传给TreeSet
作者: 刘克方    时间: 2012-5-16 09:19
本帖最后由 刘克方 于 2012-5-16 11:27 编辑

先纠正一下:不是继承comparable,而是实现,因为comparable是一个接口。
不一定要实现,在类没有实现comparable接口的时候,treeSet根据加入元素的先后进行排序。
比如:学生类有个成绩属性
       Student t1=new Student(78);
       Student t2=new Student(67);
       Student t3=new Student(89);
        set.add(t2);
        set.add(t1);
        set.add(t3);
在集合中第一个元素 为t2,第二个元素为t1,第三个元素为t3
如果学生类实现了comparable接口:代码如下
public int compareTo(Object student) {               
            Student stu=(Student) student;
                int i=0;
                if(this.grate>stu.getGrate()){
                        i=1;
                }
                else if(this.grate>stu.getGrate()) {
                        i=-1;
                }
                return 2;
        }

那么set集合会根据成绩由大到小排序:
集合中的元素顺序为:t3,t1.t2
也就是说当我们需要按照某种规则排序时才有必要实现comparable接口







作者: 刘_浩    时间: 2012-5-16 09:33
不是的呀,不加的话,他们可以有自己的排序方式 。当你需要自己的排序方式,就可以加上了。
作者: 李哲    时间: 2012-5-16 09:44
刘克方 发表于 2012-5-16 09:19
先纠正一下:不是继承comparable,而是实现,因为comparable是一个接口。

谢谢纠正。
作者: 李哲    时间: 2012-5-16 09:45
本帖最后由 李哲 于 2012-5-16 09:57 编辑
刘克方 发表于 2012-5-16 09:19
先纠正一下:不是继承comparable,而是实现,因为comparable是一个接口。

谢谢纠正。不好意思,网速太慢,多发一遍。
作者: 邓杰    时间: 2012-5-16 09:56
不是的,这些元素可以自己也可以有给自己排序的。只有当它们这些元素的排序方式不是你所需要的的时候。你才用写一个方法实现Comparable重新给这些排序;
作者: 潘东升    时间: 2012-5-16 10:38
刘克方 发表于 2012-5-16 09:19
先纠正一下:不是继承comparable,而是实现,因为comparable是一个接口。
不一定要实现,在类没有实现compa ...

  Student stu=(MachDemo) student;
这句看不懂,求解释。
还有,原来实现Comparable接口是为了让元素按指定的排序方法排序,是吧
作者: 胡团乐    时间: 2012-5-16 11:07
不是必须
因为treeSet底层为二叉树结构,使用它可以从Set中提取有序的序列,元素必须实现Comparable接口,复写里边的comparTo()方法;
比如你传的对象是学生(姓名,年龄),你就得指定按姓名还是年龄进行排序;
作者: 刘克方    时间: 2012-5-16 11:26
潘东升 发表于 2012-5-16 10:38
Student stu=(MachDemo) student;
这句看不懂,求解释。
还有,原来实现Comparable接口是为了让元素按 ...

不好意思啊粘贴代码的时候,不小心粘贴错了;Student stu=(Student)student
作者: 廖理    时间: 2012-5-16 12:49
当要要将元素加入treeSet集合时,因为treeSet的的元素时有序的,所以元素之间必须要有,要有确定元素前后顺序的规则
这个规则可以通过两种方式来实现:
1.将要加入treeSet的元素的类,实现Comparable接口,并实现其compareTo方法,此时元素就具备了自身的可比较规则了,由于这种比较方法是类的对象与生俱来的所以称为默认的比较方法。
2.我们还可以自定义一个实现了Comparator接口的类,并实现Comparator接口的compare方法然后将此类作为参数传入treeSet构造函数,此时的比较规则就是按比较器的规则来决定先后顺序的。
注意:两种方法的区别:第一种是将要加入treeSet的元素的类,实现Comparable接口,并实现其compareTo方法;
                                 第二种是重新定义了一个自定义一个实现了Comparator接口的类,并将要添加treeSet的元素的两个对象作为参数传入此自定义比较器类的compare方法。




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