あらゆる種類の要素を比較できるコンパレータを作成しようとしています。クラスの作成方法がわかりません。同じタイプの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;
}
}
}
}
助けてください、ありがとう!
これに最も近いことは、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
は、List
をComparator
とともに使用するか、List
をComparable
要素とともに使用することができます。
型がどうなるかを想定せずに、すべてに対して単一のコンパレータを作成することはできません。カスタムクラスをどのように使用しますか?どちらが他方よりも大きいかをどのように判断できますか?実際のクラスが多い場合、コンパレータは意味がありません。
一方、String、Integer、Doubleに制限すると、それらは比較可能であり、compareTo()メソッドを使用してコンパレーターを簡単に作成できます。
public int compare(T element1,T element2)
{
return element1.compareTo(element2);
}
ただし、要素の自然な順序を使用するだけで、コンパレータを使用する目的に反します。通常、これらの場合は必要ありません。
これが必ずしも有用かどうかはわかりませんが、意味のある汎用コンパレータを実装することはできません。
リフレクションインターフェイスのおかげで、たとえば、クラス名でオブジェクトを並べ替えることができます。あるいは、クラス階層によって何らかの方法でさえ。たとえば、両親の後の子供。
または、toString()メソッドが生成するものに基づいてソートすることもできます。またはhashCode()。結局のところ、すべてのオブジェクトにそれらがあります。
何をする場合でも、どちらかの要素がnullになる可能性があることを忘れないでください。
この汎用コンパレータが何のために必要かを知る必要があると思います。