如何将排序应用于 Scala 优先级队列?
How to apply ordering to a Scala Priority Queue?
我已经像这样定义了一个优先级队列
import scala.collection.mutable.PriorityQueue
...
val queue = new PriorityQueue[(Int,Int)]()
我想使用这个顺序:
如果我们比较队列中的两个项目 A 和 B,如果其 (Int,Int)
元组的第一个元素比 B 的大,则 A 比 B 大。如果它们相同,则如果 A 的 (Int,Int)
元组的第二个元素比 B 的 小,则 A 比 B 大。
如何定义这种顺序?
如果您的元素是 Int
,定义这样的 Ordering
的最简单方法是取负值,这些元素应该按相反的顺序排列。
您可以使用对象 Ordering
提供的方法创建 Ordering,然后显式将其传递给 PriotityQueue
:
// I'm using the data format, you have provided originally, before the edit
val queue = PriorityQueue(
(1, (2,3), (4,5)),
(2, (3,4), (5,6)),
(2, (4,5), (6,7))
)(Ordering.by {
case (fst, (snd, _), (_, _)) => (fst, -snd)
})
或隐含地:
implicit val MyOrdering: Ordering[(Int, (Int, Int), (Int, Int))] =
Ordering.by {
case (fst, (snd, _), (_, _)) => (fst, -snd)
}
val queue = PriorityQueue(
(1, (2,3), (4,5)),
(2, (3,4), (5,6)),
(2, (4,5), (6,7)))
我已经像这样定义了一个优先级队列
import scala.collection.mutable.PriorityQueue
...
val queue = new PriorityQueue[(Int,Int)]()
我想使用这个顺序:
如果我们比较队列中的两个项目 A 和 B,如果其 (Int,Int)
元组的第一个元素比 B 的大,则 A 比 B 大。如果它们相同,则如果 A 的 (Int,Int)
元组的第二个元素比 B 的 小,则 A 比 B 大。
如何定义这种顺序?
如果您的元素是 Int
,定义这样的 Ordering
的最简单方法是取负值,这些元素应该按相反的顺序排列。
您可以使用对象 Ordering
提供的方法创建 Ordering,然后显式将其传递给 PriotityQueue
:
// I'm using the data format, you have provided originally, before the edit
val queue = PriorityQueue(
(1, (2,3), (4,5)),
(2, (3,4), (5,6)),
(2, (4,5), (6,7))
)(Ordering.by {
case (fst, (snd, _), (_, _)) => (fst, -snd)
})
或隐含地:
implicit val MyOrdering: Ordering[(Int, (Int, Int), (Int, Int))] =
Ordering.by {
case (fst, (snd, _), (_, _)) => (fst, -snd)
}
val queue = PriorityQueue(
(1, (2,3), (4,5)),
(2, (3,4), (5,6)),
(2, (4,5), (6,7)))