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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 龙翔 初级黑马   /  2013-9-22 16:21  /  1183 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 龙翔 于 2013-9-22 20:03 编辑



TreeSet(Comparator<? super E> comparator)
          构造一个新的空 TreeSet,它根据指定比较器进行排序。




请问怎么理解这个构造函数,该比较器接受该类或该类的超集;

如果我要定义学生类的比较器的时候泛型可以写<? super Student>还是只能写<Student>?


<? super Student>我这编译无法通过.
如果student extends person


那么是不是该比较器也适用于person类?




评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

2 个回复

正序浏览
TreeSet 底层的数据结构是二叉树,之所以能排序就是底层的二叉树被排序了。楼主,下面是饿以前写过的源代码,你看一下吧!马上就能明白了,如果还不明白可以问饿、、、构造器被作为参数传递进去了!

package yting.collection;

import java.util.*;

public class TreeSetDemo1 {
        public static void main(String[] args) {
                TreeSet<Student> ts = new TreeSet<Student>();
                //TreeSet<Student> ts = new TreeSet<Student>(new strLenComparator());   //想看效果把这行代码注释去掉
                                                                                                                                                                //把上面那行代码注释掉
                ts.add(new Student("lisi001", 11));
                ts.add(new Student("lisi005", 15));
                ts.add(new Student("lisi003", 13));
                ts.add(new Student("lisi004", 14));
                ts.add(new Student("lisi002", 12));
                ts.add(new Student("lisi006", 12));
               
                Iterator<Student> it = ts.iterator();
                while(it.hasNext()) {
                        Student stu = (Student)it.next();
                        System.out.println(stu.getName()+"..."+stu.getAge());
                }
        }
}


class Student implements Comparable<Student> {
        private String name;
        private int age;
       
        public Student(String name, int age) {
                super();
                this.name = name;
                this.age = age;
        }
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
        public int getAge() {
                return age;
        }
        public void setAge(int age) {
                this.age = age;
        }
        @Override
        public int compareTo(Student stu) {
                //这里是根据name排序的
                return this.name.compareTo(stu.getName());
        }
}

//这个比较器是根据age排序的
class strLenComparator implements Comparator<Student> {

        @Override
        public int compare(Student stu1, Student stu2) {
                return (stu1.getAge() - stu2.getAge())==0 ?  stu1.getName().compareTo(stu2.getName()) : stu1.getAge() - stu2.getAge();
        }
}

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 胡智 于 2013-9-22 16:47 编辑

这个的意思是,可以传入一个比较器,建立一个可以进行按指定比较方法的TreeSet集合。
这里的(Comparator<? super E> comparator),比较器用到了泛型的下限。表示你传入的比较器里面可以传入E类类型和其父类进去。因为多态吗,父类引用可以指向子类。如果你只写Student是可以的。

<? super Student>编译不通过的问题。不知道你这泛型是写在哪里。这个是API告诉我们比较器可以传入的值的类型。这个泛型是你在定义比较器的时候用,不是传入到TreeSet集合里面用的。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马