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

回到顶部