Java TreeSet排序的2种方法

1. 自然排序,实现Comparable接口,重写compareTo方法。

让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法,这种方式也称为元素的自然排序或默认排序方式。排序代码如下:

/* 向TreeSet集合中存储自定义对象学生按照学生的年龄进行排序 */  
import java.util.*;  
//此接口强制让Student实现比较性
class Student implements Comparable { //定义Student私有属性  
    private String name;private int age; //构造Student函数,初始化  
    Student(String name, int age) {this.name = name;
        this.age = age;
    } //公共访问方法,访问私有属性  
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    } //复写Comparator中的compare方法,自定义比较器  
    public int compareTo(Object obj) {
        //判断是否属于Student类型,否则抛异常  
        if (! (obj instanceof Student)) throw new RuntimeException("NotSuchTypeException"); //将Object类对象强转为Student类  
        Student s = (Student) obj;
         //System.out.println(this.age + "--compare-" + s.age);//测试用,查看比较情况  
         //按年龄大小比较,相同则比较姓名大小,不同返回两年龄之差  
        if (this.age == s.age) {
            return this.name.compareTo(s.name);
        } else if (this.age < s.age) return this.age - s.age;
        return this.age - s.age;
    }
    /* 
     //如果按照存入顺序输出 
     public int compareTo() 
     { 
         return 1;//改为-1则按倒叙输出 
     } 
     */
}
//测试  
class TreeSetTest {
 public static void main(String[] args) { //创建集合,并添加元素  
        TreeSet ts = new TreeSet();ts.add(new Student("li01", 25));ts.add(new Student("li02", 20));ts.add(new Student("li01", 22));ts.add(new Student("li05", 24));
        ts.add(new Student("li08", 40)); //打印集合中元素  
        printE(ts);
        System.out.println("Hello World!");
    }
     //定义打印集合中元素的功能  
    public static void printE(TreeSet ts) {
        //迭代器方法获取  
        Iterator it = ts.iterator();
        while (it.hasNext()) {
            //将返回的元素(Object类)强转为Student类  
            Student s = (Student) it.next();System.out.println(s.getName() + "---" + s.getAge());
        }
    }
}

2. 比较器,实现Comparator接口,并实现其compare(Object o1,Object o2)方法。

当元素自身不具备比较性是,或者具备比较性,却不是所需要的,这时就需要让集合自身具备比较性。在集合初始化时就有了比较方式(即参阅构造函数),其实就是定自己定一个比较器,这个比较器必须实现Comparator接口,并实现其compare(Object o1,Object o2)方法,方法的返回值,是正整数、负整数或零,则两个对象较大、较小或相同,然后将这个比较器作为参数传入TreeSet构造方法中。

注意: 当两种排序方式都存在时,以比较器为主,排序时,当主要条件相同时,按次要条件排序。字符串本身具备比较性,但是它的比较方式可能不是所需要的,这时,就只能使用比较器了。






版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。