Javaのある種のコンパレータファクトリを知っている人はいますか?
public Comparator getComparatorForClass(Class clazz) {}
String、Double、Integerなどのコンパレータを返しますが、
public void addComparatorForClass(Class clazz, Comparator comparator) {}
任意のタイプの場合。
Javaのある種のコンパレータファクトリを知っている人はいますか?
public Comparator getComparatorForClass(Class clazz) {}
String、Double、Integerなどのコンパレータを返しますが、
public void addComparatorForClass(Class clazz, Comparator comparator) {}
任意のタイプの場合。
それ以外の:
factory.getComparatorForClass(x.getClass()).compare(x, y)
Comparable
簡単に実装して書くことができます:
x.compareTo(y)
文字列、プリミティブラッパー、および標準コレクションはすでに実装されていますComparable
。
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(); } }
私は頭のてっぺんからそのようなことを何も知りません。このようなものが本当に必要な場合は、自分で実装するのはそれほど難しくありません。
しかし、なぜこのようなものが必要なのか詳しく説明していただけますか?通常、クラスには「デフォルト」のコンパレータはありません。クラスにある種の自然順序がある場合は、実際にそれを実装してjava.lang.Comparable
、Comparable#compareTo(Object) : int
代わりに実装する必要があります。
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Comparable.html
コンパレータを拡張する必要があります。これは再利用可能なコードの実装に基づいています。これらのメソッドでは、データのカスタム比較を行うことができます。実装は単純です。コンパレータインターフェイスを実装するだけです。comparetoメソッドをオーバーライドします。比較コードを配置し、値の点で大きいと思われる値を返します。
デフォルトのコンパレーターは 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);
}
}