2013-03-03 13 views
12

私は比較する任意のタイプの要素を取ることができるコンパレータを作ろうとしています。私はどのようにクラスを作成するかについては不明です。私はちょうど同じタイプの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; 
     } 
    } 
} 
} 

ご協力ありがとうございました!唯一Comparableオブジェクトは、「自然の秩序」を持っている:

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

本当にあなたがすることができる最も近いです:あなたがこれまで行うことができます

+0

まず、いくつかの構文エラーがあります。 [Generics in Javaの記事](http://www.oracle.com/technetwork/java/javase/generics-tutorial-159168.pdf)をお読みください。ジェネリックスとその使い方を説明しているので、あなた自身でこれと次の問題を解決することができます。 –

+0

これは正確に何が必要ですか?私はこれがあなたの本当の問題ではないと感じます。 –

+0

数字、日付、文字のように、ユーザーが入力したデータのためのものですか?コンパイラーは、あるウィンドウを別のウィンドウと比較するようなJavaクラスで使用することができますので、今のところ質問が幅広く見えるので、指定してください。 – Geronimo

答えて

21

最も近いものはComparableインタフェースを実装する任意のオブジェクトを比較することができますComparatorですあなたはここでモデル化しようとしています。例えば、Collections.sortComparable要素とComparator、またはListListのいずれかを取ることができます。あなたはComparableオブジェクトを持っていたらしかし、一般的に、あなたは必ずしも必要Comparatorを行います

+0

最良の結果を得るために、自然順序コンパレータ: 'Collections.reverseOrder(Collections.reverseOrder());' – VGR

+4

を得るための便利な方法は、 'T extends Comparable ' – newacct

5
  1. あなたはタイプがどうなるかについていくつかの仮定せずにすべてのための単一のコンパレータを書き込むことはできません。カスタムクラスではどうしますか?どちらが他のものよりも大きいかをどのようにして決定できますか?野生のより多くのクラスについては、コンパレータは意味をなさない。一方

  2. あなたは、文字列、整数にダブルを自分自身を制限している場合、それらは同等であり、あなたは単にのcompareTo()メソッドで、コンパレータを書き込むことができます。

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

が、単純に要素の自然順序を使用し、コンパレータを使用する目的を無効にします。このような場合には、通常は必要ありません。

0

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

リフレクションインターフェイスのおかげで、たとえば、クラス名でオブジェクトを注文することができます。あるいは、クラス階層によって何らかの形ででさえあるかもしれません。親の後の子供、例えば。

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

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

...私はあなたがこの汎用コンパレータが必要なものを知る必要があると思います。

関連する問題