我的问题是这样的:
我有 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应该在较高的站点之前。 我没有达到预期的效果。请帮忙。感谢。
答案 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;
}
}