59

オブジェクトの自然順序付けまたはカスタム順序付けのいずれかを使用できる戦略パターンの一部としてコンパレータが必要です。自然順序付けのケースでは、単純なコンパレーターを書きました。

private static class NaturalComparator<T extends Comparable<? super T>> implements Comparator<T> {
    @Override
    public int compare(T o1, T o2) {
        return o1.compareTo(o2);
    }
}

十分に単純に思えますが、標準 API で誰かが知っているかどうか疑問に思っていました。TreeMap を調べたところ、そのようなクラスがなくても実行されるため、そのコードが作成されたときの答えは明らかではありませんが、後で追加された可能性があります。

4

5 に答える 5

68

Java 8 の Comparator に追加:

static <T extends Comparable<? super T>> Comparator<T> naturalOrder()

たとえば、次のように使用します。

Comparator<Double> natural = Comparator.<Double>naturalOrder();
return natural.compare(1.0, 1.1));
于 2013-11-04T17:03:53.517 に答える
54

はい、JDKには間違いなくそれがあります! ここにあります:

Collections.reverseOrder(Collections.reverseOrder())

冗談だ。(しかし、それは本当です。(実際にそれを使用しないでください。(これまで)))

于 2010-07-13T21:22:46.790 に答える
10

JDKにはありませんが、ComparableComparatorと呼ばれ、 SpringApache CommonsHibernateなどの多くのフレームワークに存在します。

于 2010-07-13T20:21:51.133 に答える
2

クラスに自然な順序付けがある場合、Java では、クラスごとに実装Comparableするよりも実装する方が一般的だと思います。Comparator

したがって、問題のオブジェクトに自然な順序付けが定義されている場合は、それらを実装ComparableしてcompareToメソッドを定義する必要があります。を探しに行く必要はありませんComparatorComparatorjava.util のほとんどのクラスは、強制される特定の順序がある場合はオプションを使用するか、compareTo他の順序が指定されていない場合は単にオブジェクトを呼び出そうとします。

つまり、簡単Comparableに言うと、クラスに自然な順序付けを課したいときはいつでも実装し、自然Comparatorな順序付け以外のものが必要な場合にのみ a を使用してください。

于 2010-07-13T20:31:46.943 に答える
2

私は Java のデフォルトのコンパレーターに詳しくありませんが、明らかに Comparator to compareTo は単なるラッパーであることがよくあります。

標準 API には一般的な「自然順序付け」はありませんが、数値などの特定の組み込み型には、自然順序付けとなる compareTo の実装があります。

TreeMapまたTreeSet、入れたオブジェクトが Comparable を実装していない場合、これらすべてが RuntimeException をスローする必要があります。したがって、たとえば、文字列または数値をスローすることはできますが、別のコレクションをスローすることはできません。

のコードはTreeMap、使用できない場合はコンパレータを使用せず、compareTo代わりに使用します。を使用するには、例外のソースである にcompareToキャストします。Comparable

    private int compare(K k1, K k2) {
      return (comparator==null ? ((Comparable <K>)k1).compareTo(k2)
                                : comparator.compare((K)k1, (K)k2));
  }
于 2010-07-13T20:13:02.807 に答える