5

Comparatorそのパラメータの1つにを必要とするメソッドがあります。通常の比較を行うaと逆の比較を行うComparatorリバースコンパレータを渡したいと思います。

java.util.CollectionsこれはreverseOrder()逆比較に適していますが、通常は見つかりませんでしComparatorた。

私の頭に浮かんだ唯一の解決策はCollections.reverseOrder(Collections.reverseOrder())です。しかし、doubleメソッドが内部を呼び出すので、私はそれが好きではありません。

もちろん、私はNormalComparatorこのように書くことができます:

public class NormalComparator<T extends Comparable> implements Comparator<T> {
    public int compare(T o1, T o2) {
        return o1.compareTo(o2);
    }
}

しかし、Javaがこれに対する解決策をすぐに利用できないことに本当に驚いています。

4

4 に答える 4

6

を指定できるほとんどの場所にはComparator、をまったく使用しないバージョンもありますComparator。その場合、自然な順序が使用されます(つまり、すべてのオブジェクトが実装されComparable、使用されることが期待されますcompareTo)。

したがって、これに対する通常の解決策は、をまったく指定しないことComparatorです。アプローチのみComparatorサポートされている特定のケースがありますか?

どうしても必要な場合は、Googleコレクション(およびGoogleコレクションのスーパーセットであるGuava )が提供し、インターフェースで定義された自然な順序を表すオブジェクトOrdering.natural()返します。を実装しているので、それを簡単に使用できます。OrderingComparableOrderingComparator

于 2010-06-02T10:07:17.397 に答える
1

しかし、Javaがこれに対する解決策をすぐに利用できないことに本当に驚いています。

私はそれがいくつかの場合に役立つと思います...あなたのように。ただし、ほとんどのユースケースでは、アプリケーションは単にオブジェクトのcompareToメソッドを直接使用します。オブジェクトを介した間接化はComparator目的を果たしません...ほとんどの場合。

私の推測では、これらのJava APIの設計者は、直接サポートするのに十分なほど重要なユースケースを考慮していなかったと思います。さらに、実装はわずか4行のコードです。

Javaクラスライブラリは完全ではありません。それと一緒に暮らすことを学ぶ:-)。

于 2010-06-02T10:31:07.823 に答える
0

逆順の場合Collections.reverseOrder()..。

Comparableインターフェイスを実装するオブジェクトのコレクションに自然な順序の逆を課すコンパレータを返します。

于 2010-06-02T10:05:07.827 に答える
0

通常、をとる過負荷があるため、通常、自然な順序は必要ありません。によって設定された例に従い、次のように書くことができます。Comparator<T>Comparable<T>Collections.reverseOrder()

private static final Comparator<?> NATURAL_ORDER =
   new Comparator<Comparable<Object>>() {
     @Override public int compare(Comparable<Object> o1, Comparable<Object> o2) {
        return o1.compareTo(o2);
     }
   };

@SuppressWarnings("unchecked")
public static <T> Comparator<T> naturalOrder() {
    return (Comparator<T>) NATURAL_ORDER;
}

次に、次のように記述できます。

List<String> names = Arrays.asList("Bob", "Alice", "Carol");
Collections.sort(names, naturalOrder());
System.out.println(names);
// prints "[Alice, Bob, Carol]"
于 2010-06-02T10:28:24.690 に答える