web-dev-qa-db-ja.com

ジェネリックコンパレータクラスを作る

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

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;
        }
    } 
}
}

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

14
DaveMcFave

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

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

これは、実際に実行できる最も近いものです。Comparableオブジェクトのみが、ここでモデル化しようとしている「自然な順序」を持っています。しかし、一般に、いったんComparableオブジェクトを取得すると、必ずしもneed a Comparatorになるとは限りません。たとえば、Collections.sortは、ListComparatorとともに使用するか、ListComparable要素とともに使用することができます。

24
Louis Wasserman
  1. 型がどうなるかを想定せずに、すべてに対して単一のコンパレータを作成することはできません。カスタムクラスをどのように使用しますか?どちらが他方よりも大きいかをどのように判断できますか?実際のクラスが多い場合、コンパレータは意味がありません。

  2. 一方、String、Integer、Doubleに制限すると、それらは比較可能であり、compareTo()メソッドを使用してコンパレーターを簡単に作成できます。

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

ただし、要素の自然な順序を使用するだけで、コンパレータを使用する目的に反します。通常、これらの場合は必要ありません。

5
Cyrille Ka

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

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

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

何をする場合でも、どちらかの要素がnullになる可能性があることを忘れないでください。

この汎用コンパレータが何のために必要かを知る必要があると思います。

0
Captain Ford