6

String をキーとして、対応する値を int として格納する HashMap オブジェクトを作成しました。ここで、優先度を割り当てるための参照として値を持つ HashMap オブジェクトに存在するすべての文字列を持つ優先度キューが必要です。私は次のコードを書きました

public class URIQueue {

      private HashMap<String,Integer> CopyQURI;
      private PriorityQueue<String> QURI;

      public class TComparator<String> {
         public int compareTo(String s1, String s2) {
            if (CopyQURI.get(s2) - CopyQURI.get(s1) >= 0) {
               return 1;
            } else {
               return 0;
            }
         }
      }

      public URIQueue() {
         CopyQURI=new HashMap<>(100);
         TComparator<String> tc=new TComparator<>();
         QURI=new PriorityQueue<>(100, tc); //Line x
      }
 }

行 x は、優先度キューの型引数を推測できないというエラーを示しています。私が犯した間違いを教えてください。

4

1 に答える 1

3

あなたが参照しているエラーは、省略したジェネリック型パラメーターを推測できないことを示しています。その理由は、使用しているコンストラクターが不明であるためです。2 番目の引数はコンパレータではないため、不明です。コンストラクターが受け入れるタイプセーフにするために、コンパレーターはjava.util.Comparator インターフェースを実装する必要があります。

public class TComparator<String> implements Comparator<String> {

   @Override
   public int compare(String arg0, String arg1) {
      // ...
   }
}

また、Comparatorインターフェイスでは、適切なメソッドが呼び出されcompare、 ではありませんcompareTo

一般的なアドバイスとして、 Louis Wassermanに同意する必要があります。引数が 2 つある場合、コンパレータはアプリケーションの状態に依存せず、常に同じ結果を返す必要があります。いくつかのケースを考えないのは簡単すぎて、最終的にアプリケーションに欠陥があります。

于 2012-09-24T23:22:10.927 に答える