Sedgewick的《算法》一书中有一段代码我并不真正理解,特别是关于比较器的部分。我非常了解其他一切的工作原理,例如,提供的算法,使用Comparators与Comparable的意图等。然而,有一件事我似乎没有得到,那就是静态类中compare(Transaction v,Transaction w)方法的参数。例如,Object数组由排序中的另一个Object引用传递和持有。当调用helper方法less()时,Object数组的两个元素由另一个对象引用持有。但这是我没有得到的:在
public static class WhoOrder implements Comparator<Transaction> {
public int compare(Transaction v, Transaction w) {
return v.who.compareTo(w.who);
}
}
对象引用似乎已被事务引用所取代。这是怎么回事?对于多态性,您必须使用显式下转换,但这似乎绕过了这一点。我的猜测是因为参数化类型,但我不知道为什么。
包含实现Comparator 的静态类的类
public class Transaction {
private final String who; // customer
private final Date when; // date
private final double amount; // amount
...
// ascending order of account number
public static class WhoOrder implements Comparator<Transaction> {
public int compare(Transaction v, Transaction w) {
return v.who.compareTo(w.who);
}
}
public static void main(String[] args) {
...
Arrays.sort(a, new Transaction.WhoOrder());
}
分类类别:
// use a custom order and Comparator interface - see Section 3.5
public static void sort(Object[] a, Comparator c) {
int N = a.length;
for (int i = 0; i < N; i++) {
for (int j = i; j > 0 && less(c, a[j], a[j-1]); j--) {
exch(a, j, j-1);
}
}
}
// is v < w ?
private static boolean less(Comparator c, Object v, Object w) {
return (c.compare(v, w) < 0);
}
// exchange a[i] and a[j]
private static void exch(Object[] a, int i, int j) {
Object swap = a[i];
a[i] = a[j];
a[j] = swap;
}
WhoOrder
被实现为Comparator
,Transaction
是其类型参数,因此compare
的实现接受两个Transactions
。但是,less
方法采用原始Comparator
(没有类型)。为了实现向后兼容性,在执行此操作时,将禁用泛型类型检查,因此可以将2个Objects
传递给compare
。