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