0

我的问题是这样的:

我有TestQ

class TestQ{
 public void main(String[] args){
    PriorityQueue<Request> requestQ = new PriorityQueue<Request>(5, new SortRequest());
    //...
 }
}

我的Request类有两个字段以及 getter 和 setter。

int siteId;
int timestamp;

SortRequest类是这样

class SortRequest implements Comparator<Request>{
   public int compare(Request r1, Request r2) {
       return r1.getTimeStamp()-r2.getTimeStamp();
   }
}

TestQ类中,我为 siteId 和 Timestamp 获取用户输入。约束是 siteId 应该是唯一的,但时间戳可以相同或不同。(假设 5 个站点的 siteIds 为 1,2,3,4,5)。

因为我正在根据时间戳值对我的请求队列进行排序。如果两个/多个站点的时间戳相等,那么我希望 PriorityQueue 根据 siteId 对其进行排序,以便较低的 siteId 应该在较高的站点之前。我没有得到预期。请帮忙。谢谢。

4

2 回答 2

1

您可以对以下内容进行简单修改compare()

public int compare(Request r1, Request r2) {
    int diff = Integer.compare(r1.getTimeStamp(), r2.getTimeStamp());

    if (diff != 0)
        return diff;

    return Integer.compare(r1.siteId(), r2.siteId());
}

用于Integer.compare()比较值,而不是减去它们。后者可能导致溢出问题和不正确的结果(感谢@Vash 指出这一点)。

于 2013-10-24T18:42:34.273 回答
0

你的比较器需要是这样的

class SortRequest implements Comparator<Request>{
   public int compare(Request r1, Request r2) {
      if(r1.getTimeStamp()!=r2.getTimeStamp())
         return new Integer(r1.getTimeStamp()).compareTo(r2.getTimeStamp());
      if(r1.getSiteId()!=r2.getSiteId())
         return new Integer(r1.getSiteId()).compareTo(r2.getSiteId());
      return 0;      
   }
}
于 2013-10-24T18:44:31.097 回答