2016-04-03 6 views
2

これは宿題なので、私は答えを与えるよりもむしろいくつかの説明を好むでしょう。一般的なペアのコレクションを並べ替える方法

私は目標は、一般的な方法を記述することで任意のキー値Kを取ることができ、一般的なペアクラス、および任意の値V

を持っている:

public static <...> Collection<Pair<...>> sortPairCollection(Collection <Pair<....>> col)

のみ、他のガイドラインがありますKタイプは、同等のものを実装しなければならないこと。< ...>

いくつかの掘削後、私は人々がこのようなものをお勧めしました:

public static Collection<Pair<?,?>> sortPairCollection(Collection<Pair<?,?>> col) 
{ 
    Collections.sort(col, new Comparator<Pair<?,?>>(){ 
     @Override 
     public int compare(Pair<?, ?> x, Pair<?, ?> y) { 
      return (Integer)x.v() - (Integer)y.v(); 
     } 
    }); 
} 

をしかし、それは私のために動作しません、私はsortメソッドは、これらのパラメータには適用されませんというエラーを取得します。私はここからどこに行くのか本当に知りません。

答えて

6

Collections.sortは、Listインスタンスでのみ有効で、一般的にはCollectionsではありません。たとえば、HashSetをソートするのは意味がありません。

第2に、算術オーバーフローに、あなたはそのようなコンパレータで減算を使用しないでください。 Integer.compareを使用する方が常に良いです。

また、戻り値の型Collection<Pair<?,?>>と方法は何かを返す必要があります。 colを返すことができますが、colに突然変異させているので、voidという方法を作るほうが意味があります。

もう一つのポイントは、第二種のパラメータはInteger(私はv()タイプVを返していると仮定しています)でない限り、あなたの方法はClassCastExceptionをスローしますように見えるということです。この場合、を使用することができるので、Pair<?, ?>のメソッドを記述する必要はありません。 List<Pair<String, Integer>>は(this questionまたはthis oneを参照)List<Pair<?, Integer>>ではないので

最後に、原因ジェネリックはJavaで作業方法を、あなたは実際には、あなたの現在の署名でList<Pair<String, Integer>>に合格することができません。できるようにするには、引数の型はList<? extends Pair<?, Integer>>である必要があります。

編集

私は今、私は本当に質問に答えていないことを実現します。アイデアは元のコレクションを変更するのではなく、新しいコレクションを返すことです。また、KComparableを実装する必要があるため、並べ替えは値ではなくキーで行う必要があります。

compareToメソッドを使用するためには、あなたはK extends Comparableことを指定する必要があります。これを行う方法は、署名を

public static <K extends Comparable<? super K>, V> Collection<Pair<K, V>> sortPairCollection(Collection<Pair<K, V>> col) 

を使用するこれは、一口のビットである - ジェネリックメソッドシグネチャの複雑さを大幅に増加しています。

K extends Comparable<? super K>は、Kを他のKと比較することができます。

あなたはまだListを使用する必要があります。 Collectionを受け入れるArrayListコンストラクタを使用できます。

リクエストに応じて、正しいコードを書くようにしておきます。

+2

はまた、メソッドが返すように宣言し 'コレクション>'が、実際にはしません。 – Tunaki

+0

@ Tunakiあなたはそれについて正しいです。私はソートを最初に見つけようとしていたので、まだそれを知りませんでした。 – Lighthat

+1

@屯木ありがとう、私はそれを逃した。 –

-1

はここで完全なプログラムです:

public static <K extends Comparable<? super K>, V extends Comparable<? super V>> void sortPairCollection(List<Pair<K, V>> col){ 

     Collections.sort(col, new Comparator<Pair<K,V>>(){ 

      public int compare(Pair<K, V> o1, Pair<K, V> o2) { 

       int keyflag = o1.getValue().compareTo(o2.getValue()) == 0 ? o1.getKey().compareTo(o2.getKey()): o1.getValue().compareTo(o2.getValue()) ; 

       return keyflag; 

      }}); 

    } 
+0

は明らかに質問に記載されている:私は答えを与えるだけでなく、いくつかの説明を好むだろう。これは答えではありません –

関連する問題