SedgewickのAlgorithmsの本、特にコンパレータに関する部分からは、私が本当に理解していないコードがあります。提供されたアルゴリズム、ComparatorsとComparableを使用する意図など、他のすべてがどのように機能するかをよく理解しています。しかし、私が得ていないように見えるのは、compare(Transaction v、Transaction w )静的クラスのメソッド。たとえば、オブジェクトの配列は、ソート中の別のオブジェクト参照によって渡され、保持されます。ヘルパーメソッドless()が呼び出されると、Object配列の2つの要素が別の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;
}