如何将订购应用于Scala Priority Queue?

时间:2015-06-17 13:27:33

标签: algorithm scala priority-queue

我已经定义了这样的优先级队列

import scala.collection.mutable.PriorityQueue
...
val queue = new PriorityQueue[(Int,Int)]()

我想使用这个顺序:

如果我们比较队列中的两个项目A和B,如果其(Int,Int)元组的第一个元素大于,则A大于B。如果它们相同,那么如果其(Int,Int)元组的第二个元素小于,则A大于B

如何定义这种排序?

1 个答案:

答案 0 :(得分:1)

如果你的元素是Int,那么定义这样一个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)))