1

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;
}
4

1 に答える 1

2

WhoOrderはタイプパラメータとしてComparatorwithとして実装されるため、の実装は2つを受け入れます。ただし、メソッドはraw (型なし)を取ります。これを行うときの下位互換性のために、ジェネリック型チェックが無効になっているため、2をに渡すことができます。TransactioncompareTransactionslessComparatorObjectscompare

于 2012-09-06T12:20:56.213 に答える