Java中HashMap对象的优先级队列

Java中HashMap对象的优先级队列,java,priority-queue,Java,Priority Queue,我创建了一个HashMap对象,该对象将字符串存储为key,相应的值存储为int。现在,我希望有一个优先级队列,该队列中所有字符串都存在于HashMap对象中,值作为分配优先级的引用。我已经编写了以下代码 public class URIQueue { private HashMap<String,Integer> CopyQURI; private PriorityQueue<String> QURI; public class

我创建了一个HashMap对象,该对象将字符串存储为key,相应的值存储为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
      }
 }
公共类队列{
私有HashMap CopyQURI;
私人优先队列;
公共类比较程序{
公共整数比较(字符串s1、字符串s2){
如果(CopyQURI.get(s2)-CopyQURI.get(s1)>=0){
返回1;
}否则{
返回0;
}
}
}
公共队列(){
CopyQURI=新HashMap(100);
t比较程序tc=新的比较程序();
QURI=new PriorityQueue(100,tc);//第x行
}
}

第x行显示错误,无法推断优先级队列的类型参数。请告诉我我犯了什么错误。

您所指的错误表明,它无法猜测您省略的泛型类型参数。原因是您使用的构造函数未知。这是未知的,因为您的第二个参数不是比较器。您的比较器必须实现,以使构造函数能够接受类型安全

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

   @Override
   public int compare(String arg0, String arg1) {
      // ...
   }
}
公共类TComparator实现Comparator{
@凌驾
公共整数比较(字符串arg0、字符串arg1){
// ...
}
}
另外请注意,在
比较器
界面中,适当的方法称为
比较
,而不是
比较

一般的建议是,我必须同意Louis Wasserman的观点,对于两个给定的参数,比较器应该总是返回相同的结果,而不依赖于应用程序的状态。不考虑某些情况太容易了,应用程序最终会有缺陷。

这种“可变比较器”可能非常危险,并且容易出现错误。您最好创建一个新类来保存字符串和整数。