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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 李哲 于 2012-5-16 10:03 编辑

如题。

9 个回复

正序浏览
当要要将元素加入treeSet集合时,因为treeSet的的元素时有序的,所以元素之间必须要有,要有确定元素前后顺序的规则
这个规则可以通过两种方式来实现:
1.将要加入treeSet的元素的类,实现Comparable接口,并实现其compareTo方法,此时元素就具备了自身的可比较规则了,由于这种比较方法是类的对象与生俱来的所以称为默认的比较方法。
2.我们还可以自定义一个实现了Comparator接口的类,并实现Comparator接口的compare方法然后将此类作为参数传入treeSet构造函数,此时的比较规则就是按比较器的规则来决定先后顺序的。
注意:两种方法的区别:第一种是将要加入treeSet的元素的类,实现Comparable接口,并实现其compareTo方法;
                                 第二种是重新定义了一个自定义一个实现了Comparator接口的类,并将要添加treeSet的元素的两个对象作为参数传入此自定义比较器类的compare方法。
回复 使用道具 举报
潘东升 发表于 2012-5-16 10:38
Student stu=(MachDemo) student;
这句看不懂,求解释。
还有,原来实现Comparable接口是为了让元素按 ...

不好意思啊粘贴代码的时候,不小心粘贴错了;Student stu=(Student)student
回复 使用道具 举报
不是必须
因为treeSet底层为二叉树结构,使用它可以从Set中提取有序的序列,元素必须实现Comparable接口,复写里边的comparTo()方法;
比如你传的对象是学生(姓名,年龄),你就得指定按姓名还是年龄进行排序;
回复 使用道具 举报
刘克方 发表于 2012-5-16 09:19
先纠正一下:不是继承comparable,而是实现,因为comparable是一个接口。
不一定要实现,在类没有实现compa ...

  Student stu=(MachDemo) student;
这句看不懂,求解释。
还有,原来实现Comparable接口是为了让元素按指定的排序方法排序,是吧
回复 使用道具 举报
邓杰 中级黑马 2012-5-16 09:56:57
7#
不是的,这些元素可以自己也可以有给自己排序的。只有当它们这些元素的排序方式不是你所需要的的时候。你才用写一个方法实现Comparable重新给这些排序;
回复 使用道具 举报
本帖最后由 李哲 于 2012-5-16 09:57 编辑
刘克方 发表于 2012-5-16 09:19
先纠正一下:不是继承comparable,而是实现,因为comparable是一个接口。

谢谢纠正。不好意思,网速太慢,多发一遍。
回复 使用道具 举报
刘克方 发表于 2012-5-16 09:19
先纠正一下:不是继承comparable,而是实现,因为comparable是一个接口。

谢谢纠正。
回复 使用道具 举报
不是的呀,不加的话,他们可以有自己的排序方式 。当你需要自己的排序方式,就可以加上了。
回复 使用道具 举报
本帖最后由 刘克方 于 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接口






回复 使用道具 举报
这个不是必须的 也可以定义一个比较器在比较器重自定义比较方法 然后将比较器对象传给TreeSet
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马