我正在尝试在Scala中创建一个简单的优先级队列:
val priorities: mutable.PriorityQueue[Priority] = mutable.PriorityQueue(
Priority(2, 302),
Priority(3, 300),
Priority(5, 400),
Priority(4, 309),
Priority(1, 301)
)(Ordering.by[Priority, Int](_.priority).reverse)
case class Priority(priority: Int, value: Int)
而当我这样做时priorities.foreach(p => println(p.priority, p.value))
我期望的输出是:
(1,301)
(2,302)
(3,300)
(4,309)
(5,400)
但是我得到:
(1,301)
(2,302)
(5,400)
(4,309)
(3,300)
如您所见,订购存在一些问题。请问我在哪里出错了,我应该怎么做才能获得所需的输出?
foreach
方法处理PriorityQueue
的所有元素,但不一定按排序顺序处理。如果删除元素,则可以看到排序正常:
while (priorities.nonEmpty) println(priorities.dequeue())
Priority(1,301)
Priority(2,302)
Priority(3,300)
Priority(4,309)
Priority(5,400)
该实现将第一个元素保留为最高优先级元素,但其余元素未排序。 dequeue
将把新的最高优先级元素放到最前面。
似乎没有一种无损显示顺序显示整个PriorityQueue
的方法。