本帖最后由 逄焕玮 于 2012-1-28 15:20 编辑
TreeSet类是需要对存入Set集合中的元素进行排序的,也就是说一个类需要实现Comparable接口,重写compareTo()方法,让该类对象具备了比较性,才能存入TreeSet的,往TreeSet里添加不具备比较性的元素,是会报ClassCastException的
上述示例中 class Student 可改写如下- class Student implements Comparable<Student> {
- private String name;
- private int age;
- Student(String name, int age) {
- this.name = name;
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public int getAge() {
- return age;
- }
- // 默认排序方式为学生姓名的自然顺序,即字典顺序
- // 若姓名相同,则按年龄由小到大排列
- // 对于姓名年龄均相同的,认为是同一个人,存不进去
- public int compareTo(Student stu) {
- // 方法内部调用的这俩compareTo是String类实现Comparable接口,重写的方法
- // int compareTo(String anotherString) 按字典顺序比较两个字符串,详见API文档 java.lang.String类
- if (this.name.compareTo(stu.name) > 0)
- return 1;
- if (this.name.compareTo(stu.name) == 0)
- return this.age - stu.age; // 姓名相同时,比较年龄
- return -1;
- }
- }
复制代码 上述为TreeSet的第一种排序方式:
让存入TreeSet的元素具备比较性,也就是需要让元素对应的类实现Comparable接口,覆盖compareTo方法,该方式也称为元素的自然顺序,或者默认顺序
TreeSet还有第二种排序方式:
当元素自身不具备比较性时,或者其拥有的比较性并不是我们所需要的,这时就需要让容器自身具备比较性
通过构造方法 TreeSet(Comparator<? super E> comparator) 构造一个新的空 TreeSet,它根据指定的比较器Comparator进行排序。
需要自建一个比较器,implements Comparator,实现其int compare(T o1, T o2) 方法- class MyComparator implements Comparator<Student> {
- public int compare(Student s1, Student s2) {
- int num = s1.getName().compareTo(s2.getName());
- if (num == 0)
- return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
- //int的包装类Integer也有compareTo方法的
- return num;
- }
- }
复制代码 TreeSet<Student> ts = new TreeSet<Student>(new MyComparator());
new一个比较器对象,作为参数传递给TreeSet的构造方法
当两种方式共存时,以Comparator为主,Comparable为次 |