Scala - Сбой заказа для PriorityQueue - PullRequest
0 голосов
/ 08 февраля 2020

Я пытаюсь создать простую очередь с приоритетами в 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)

Как видите, с заказом есть некоторые проблемы. Могу ли я получить некоторую информацию о том, где я иду не так и что я должен сделать, чтобы получить желаемый результат?

1 Ответ

3 голосов
/ 08 февраля 2020

Метод 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 в порядке.

...