关于Comparable接口

每一个需要排序的类都必须实现Comparable接口,才能进行排序。
在Java中,比如Integer、Double、String 等,都实现了此接口,由此我们才能调用类似Array.sort(a)这样的排序算法对数组a进行排序。
如果我们自己写了个类,并且需要对这个类进行排序,那么我们必须实现此接口。例如:Date类

class Date implements Comparable<Date>{
    private int year;
    private int month;
    private int day;

    ...//其他方法

    //实现此方法
    public int compareTo(Date that){
        if(this.year > that.year){return +1;}
        if(this.year < that.year){return -1;}
        if(this.month > that.month){return +1;}
        if(this.month < that.month){return -1;}
        if(this.day > that.day){return +1;}
        if(this.day < that.day){return -1;}         
        return 0;
    }
    //对于vw三种情况,java的习惯实在v.compareTo(w)时分别返回一个小于零的数、等于零的数、大于零的数。
}

此外,还有一种写法–

public class MaxPQ<Key extends Comparable<Key>>

这样写的意思是Key是一个泛型,并且这个泛型已经实现了Comparable接口,说明白点就是:MaxPQ类创建的实例对象不能进行比较,可以进行比较的是Key。调用构造函数时,用如下语句:

MaxPQ<Integer> mpq = new MaxPQ<Integer>();
(和泛型的一样)

另外,上面的写法和下面的完全不一样

public class MaxPQ<Item> implements Comparable<Item>

原因:这个implements了接口Comparable,需要实现public int comparaTo(...)方法,而上面的那个是泛型extends了Comparable。

参考:http://lan2720.github.io/2015/10/24/%E5%9F%BA%E4%BA%8E%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE/

public class BinarySearchST<Key extends Comparable<Key>, Value> {
    private static final int INIT_CAPACITY = 2;
    private Key[] keys;
    private Value[] vals;
    private int N = 0;

    /**
     * Initializes an empty symbol table.
     */
    public BinarySearchST() {
        this(INIT_CAPACITY);
    }

    /**
     * Initializes an empty symbol table with the specified initial capacity.
     */
    public BinarySearchST(int capacity) { 
        keys = (Key[]) new Comparable[capacity]; 
        vals = (Value[]) new Object[capacity]; 
    }   
}
//在类的定义处BinarySearchST, Value>即使用了泛型,并且注明了Key实现了Comparable接口。
//同样,***可以看到后面的keys定义中new出的是一个Comparable类型的对象组成的数组,后来转成Key[];vals new出的是Object类型的对象数组,因为只有键进行比较(方便进行排序),value不需要有比较方法***。keys和vals是两个关键的平行数组。

你可能感兴趣的:(关于Comparable接口)