8

Javaのある種のコンパレータファクトリを知っている人はいますか?

public Comparator getComparatorForClass(Class clazz) {}

String、Double、Integerなどのコンパレータを返しますが、

public void addComparatorForClass(Class clazz, Comparator comparator) {}

任意のタイプの場合。

4

5 に答える 5

13

それ以外の:

factory.getComparatorForClass(x.getClass()).compare(x, y)

Comparable簡単に実装して書くことができます:

x.compareTo(y)

文字列、プリミティブラッパー、および標準コレクションはすでに実装されていますComparable

于 2008-10-26T08:47:58.340 に答える
10

CommonsLangCompareToBuilderから使用します。

Comparable.compareTo(Object)メソッドの実装を支援します。

このクラスを使用するには、次のようにコードを記述します。

public class MyClass {
  String field1;
  int field2;
  boolean field3;

  ...

  public int compareTo(Object o) {
    MyClass myClass = (MyClass) o;
    return new CompareToBuilder()
      .appendSuper(super.compareTo(o)
      .append(this.field1, myClass.field1)
      .append(this.field2, myClass.field2)
      .append(this.field3, myClass.field3)
      .toComparison();
  }
}
于 2008-10-26T08:53:02.823 に答える
4

私は頭のてっぺんからそのようなことを何も知りません。このようなものが本当に必要な場合は、自分で実装するのはそれほど難しくありません。

しかし、なぜこのようなものが必要なのか詳しく説明していただけますか?通常、クラスには「デフォルト」のコンパレータはありません。クラスにある種の自然順序がある場合は、実際にそれを実装してjava.lang.ComparableComparable#compareTo(Object) : int代わりに実装する必要があります。

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Comparable.html

于 2008-10-26T08:48:06.080 に答える
1

コンパレータを拡張する必要があります。これは再利用可能なコードの実装に基づいています。これらのメソッドでは、データのカスタム比較を行うことができます。実装は単純です。コンパレータインターフェイスを実装するだけです。comparetoメソッドをオーバーライドします。比較コードを配置し、値の点で大きいと思われる値を返します。

于 2008-10-26T12:27:12.907 に答える
0

デフォルトのコンパレーターは Java には存在しません。ただし、たとえば、Comparable クラスの派生型の compareTo() メソッドではなくコンパレーターを使用することを意図したカスタマイズされたサーチャーを使用してコーディングしている場合は、静的な内部コンパレーター クラスをデフォルトのコンパレーターとして記述し、単純にcompare() メソッドを呼び出すには、compareTo() を呼び出します。

例:

クラス Searcher> { プライベート コンパレータ コンパレータ;

Searcher(Comparator<T> comparator) {
    this.comparator = comparator;
}

Searcher() {
    this(new DefaultComparator<T>());
}

int search(...) {
    ...
}

private static class DefaultComparator<E extends Comparable<E>> 
        implements Comparator<E> {
    public int compare(E o1, E o2) {
        return o1.compareTo(o2);
    }
}
于 2011-03-26T00:05:55.357 に答える