PriorityQueue具有相同优先级的对象
我正在使用优先级队列来排序和使用大量自定义对象。对象具有“权重”,即其自然顺序。但是,插入优先级队列的不同对象可能具有相同的“权重”。在这种情况下,我希望优先级队列按照它们放入队列的顺序对其进行排序。
例如,如果我按此顺序添加CustomObjects A,B,C,D,并且都具有相同的“权重”,则优先级队列也应按该顺序返回它们-
即使我轮询一个或多个对象在加入其他人之前。
这是我的自定义对象的CompareTo:
public int compareTo(CustomObject o) { int thisWeight = this.weight;
int thatWeight = o.weight;
if(thisWeight < thatWeight){
return -1;
}
else{
return 1;
}
}
虽然我认为这样可以保持最初的顺序,但事实并非如此。当我输入权重为1的A,B,C时会发生这种情况;民意测验A;
并加上权重为1的D,E。不知何故,D和E在B之后但在C之前排序。
我知道Iterator for PriorityQueues不会返回正确的顺序,因此查看顺序的能力受到限制-
但是,我可以看到元素离开队列的顺序,并且显然不遵循路径我想要的。
有什么建议吗?
回答:
如果需要根据插入顺序进行排序,则需要使用额外的元素作为时间戳。即在插入和相等的权重下使用,timestamp
以查看首先插入哪个元素。所以CustomObject
应该是这样的:
class CustomObject { int weight;
long timestamp;
}
比较应该是:
public int compareTo (CustomObject o) { int thisWeight = this.weight;
int thatWeight = o.weight;
if (thisWeight != thatWeight) {
return thisWeight - thatWeight;
}
else {
return this.timestamp - o.timestamp;
}
}
较小的timestamp
表示它是 较早 插入的 , 因此您可以保持插入顺序。
您还可以通过维护在每个add
或上更新的计数器来使用“逻辑”时间remove
。
以上是 PriorityQueue具有相同优先级的对象 的全部内容, 来源链接: utcz.com/qa/423231.html