6

我创建了一个 HashMap 对象,该对象将字符串存储为键,并将相应的值存储为 int。现在我想要一个优先级队列,其中包含 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

您所指的错误指出,它无法猜测您省略的泛型类型参数。原因是您使用的构造函数是未知的。不知道,因为您的第二个参数不是比较器。您的比较器必须实现java.util.Comparator 接口,以便构造函数接受类型安全。

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

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

另外请注意,在Comparator接口中调用了适当的方法compare而不是compareTo.

我必须同意Louis Wasserman的一般建议,对于两个给定的参数,比较器应该始终返回相同的结果,而不是依赖于应用程序的状态。不去想一些案例太容易了,应用程序最终还是有缺陷的。

于 2012-09-24T23:22:10.927 回答