当前位置: 首页 > 知识库问答 >
问题:

PriorityQueue具有相同优先级的对象

孔硕
2023-03-14
public int compareTo(CustomObject o) {
    int thisWeight = this.weight;
    int thatWeight = o.weight;
    if(thisWeight < thatWeight){
        return -1;
    }
    else{
        return 1;
    }
}

我知道PriorityQueues的迭代器没有返回正确的顺序,因此我查看顺序的能力受到限制--但是我可以看到元素离开队列的顺序,而且它显然没有按照我希望的路径运行。

建议?

共有1个答案

苏昂雄
2023-03-14

如果需要根据插入顺序进行排序,则需要为时间戳使用一个额外的元素。即。在插入和相等权重时,使用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表示插入的时间较早,因此您可以按照插入顺序进行操作。

 类似资料:
  • 我正在使用std::priority\u队列和std::vector中的一些自定义对象。现在假设在调用top()函数时,有具有相同优先级的对象,我会按从最旧到最新的顺序获取它们。那么我的问题是,有没有可能改变这种行为,以便top()在优先级相同的情况下返回最近的对象?

  • 问题内容: 以下是典型的读写器模式(很多读取而很少写入) 我想知道是否有可能优先考虑作家和读者?例如,如果其他线程不断持有读取锁,通常writer可能会等待很长一段时间(也许永远),因此有可能使writer具有更高的优先级,因此只要有writer出现,就可以认为它是高优先级(跳过行)之类的。 问题答案: 按照javadoc的,JDK实现并 不会 有任何读/写器的优先级。但是,如果你使用了“公平”的

  • 我已经实现了从head中提取item,更新它的优先级并将它放回队列的例程(使用AtomicReference) 现在我需要找出队列中的任意条目,更改它的优先级并将其放回队列中。看来PriorityQueue不支持这一点,那么我应该使用哪个类来完成期望的行为呢?

  • 我需要构建一个具有优先级的“不公平信号量”。例如:当优先级为1的线程想要获取信号量时,它只需等待具有相同优先级的另一个线程完成,然后就可以获取()。但是,当优先级为2的线程想要获取信号量时,它必须等待优先级为1的所有线程完成后才能使用信号量,然后尝试获取()。我总共有4个不同的优先事项。这是我尝试过的,但没有成功。 有人有什么解决办法吗?

  • 我看到的替换优先级队列比较器的公认答案是在新的比较类中重载操作符。 然而,我想为队列实现几个(10)不同的比较函数,并在运行时在main()中创建pq时选择一个。我必须做10个不同的比较类还是有更简单的方法来做到这一点?

  • 我正在研究一种算法,在该算法中,我希望在从该优先级队列中删除元素时,保持优先级队列中具有相同优先级的元素的FIFO顺序。 虽然,我已经看到了将自动递增的序列号作为辅助键的解决方案,并使用它来打破联系,但我需要类似的链接,但我面临的问题是,我想要比较的元素-TestItemChange(下面示例中的类)没有实现Compariable,我无法(也不想)修改它以使其实现。所以现在,在优先级队列中没有FI