如果值相等,则PriorityQueue排序不保持字母顺序

时间:2013-10-24 18:38:44

标签: java sorting

我的问题是这样的:

我有 TestQ

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

我的请求类有两个字段以及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应该在较高的站点之前。 我没有达到预期的效果。请帮忙。感谢。

2 个答案:

答案 0 :(得分: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指出这一点)。

答案 1 :(得分: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;      
   }
}