16

あらゆる種類の要素を比較できるコンパレータを作成しようとしています。クラスの作成方法がわかりません。同じタイプの2つの要素(ただし、クライアントが指定するタイプ(整数、文字列、倍精度など))を比較して、どちらが他方よりも大きいかを確認したいだけです。

public class InsertionComparator implements Comparator<T>
{
/**
 * Compares two elements.
 * 
 * @param  f1  The first element you want to compare.
 * @param  f2  The second element you want to compare.
 * @return  -1,0,1  Whether or not one is greater than, less than,
 * or equal to one another.
 */
public int compare(<T> element1,<T> element2)
{
    if(element1 < element2)
    {
        return -1;
    }
    else
    {
        if(element1 > element2)
        {
            return 1;
        }
        else
        {
            return 0;
        }
    } 
}
}

助けてください、ありがとう!

4

3 に答える 3

28

これに最も近いのは、インターフェイスComparatorを実装する任意のオブジェクトを比較できる です。Comparable

class NaturalComparator<T extends Comparable<T>> implements Comparator<T> {
  public int compare(T a, T b) {
    return a.compareTo(b);
  }
}

これが実際にできる最も近い方法ですComparable。ここでモデル化しようとしている「自然な順序」を持つのはオブジェクトだけです。しかし、一般に、オブジェクトを取得しComparableたら、必ずしもが必要というわけではありません。ComparatorCollections.sortListComparatorListComparable

于 2013-03-03T19:41:58.707 に答える
5
  1. 型がどうなるかについていくつかの仮定がなければ、すべてに対して単一のコンパレータを書くことはできません。カスタムクラスで何をしますか?どちらが他のものよりも大きいかをどのように判断できますか? 野生のより多くのクラスでは、コンパレータは意味がありません。

  2. 一方、String、Integer、Double に制限する場合、それらは Comparable であり、compareTo() メソッドを使用してコンパレータを簡単に記述できます。

    public int compare(T element1,T element2)
    {
        return element1.compareTo(element2);
    }
    

しかし、そうすると単純に要素の自然な順序を使用することになり、比較演算子を使用する目的が無効になります。通常、これらの場合は必要ありません。

于 2013-03-03T19:43:39.827 に答える
0

これが必ずしも有用かどうかはわかりませんが、意味のあるジェネリック コンパレータを実装することはできません。

リフレクション インターフェイスのおかげで、たとえば、オブジェクトをクラス名で並べ替えることができます。または、クラス階層による何らかの方法でさえあるかもしれません。たとえば、親の次は子供です。

または、 toString() メソッドが生成するものに基づいて並べ替えることができます。または hashCode()。結局のところ、すべてのオブジェクトにはそれらがあります。

何をするにしても、いずれかの要素が null になる可能性があることを忘れないでください。

この一般的なコンパレータが必要な理由を知る必要があると思います。

于 2013-03-03T19:49:47.760 に答える