每一个需要排序的类都必须实现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;
}
//对于v<w,v=w,v>w三种情况,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。
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<Key extends Comparable<Key>, Value>即使用了泛型,并且注明了Key实现了Comparable接口。
//同样,***可以看到后面的keys定义中new出的是一个Comparable类型的对象组成的数组,后来转成Key[];vals new出的是Object类型的对象数组,因为只有键进行比较(方便进行排序),value不需要有比较方法***。keys和vals是两个关键的平行数组。