【问题标题】:How to apply ordering to a Scala Priority Queue?如何将排序应用于 Scala 优先级队列?
【发布时间】:2015-06-17 13:27:32
【问题描述】:

我已经像这样定义了一个优先级队列

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

我想使用这个排序:

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

如何定义这种排序方式?

【问题讨论】:

  • 向 OP 添加代码
  • 简化了我的帖子以解决问题的核心
  • 另外,回答编辑前的问题:PriorityQueue没有被弃用,只有deprecatedInheritance,所以你不应该extends它,但可以正常使用它。您可以使用queue += itemqueue.enqueue(item) 添加项目,使用queue.head 查找最大的项目,并使用queue.dequeue() 获取+删除最大的项目
  • += 和 enqueue 或者 + 调用 enqueue 之间有什么显着区别吗?
  • enqueue 接受几个项目并将它们全部添加:q.enqueue(a, b, c, d) 添加 a、b、c 和 d。 ++= 接受一个 iterable 项并添加所有项。 += 只接受一个项目。 ++ 也采用序列,但在添加队列之前克隆队列。

标签: algorithm scala priority-queue


【解决方案1】:

如果您的元素是Ints,定义这样的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)))

【讨论】:

  • 隐含的东西是什么意思?所有优先级队列都根据 MyOrdering 隐式排序? Scala 如何知道何时应用隐式排序以及应用于什么?
  • 如果您在函数中定义或导入隐式,那么直到函数结束为止都是如此。如果你在一个类中定义它,那么它在这个类中无处不在。但是您仍然可以显式传递隐式参数。还可以在这里阅读有关隐含的种类以及它们的来源:stackoverflow.com/questions/5598085/…
  • 实际上这个答案的一部分可能对我不起作用。 val queue = PriorityQueue[(Int,Int)]( Ordering.by {case (a,b) => (a, -b)} ) 有什么问题?它给了我错误error: missing parameter type for expanded function
  • @user5019849 第一个参数是项目,Ordering 是第二个参数。所以应该是PriorityQueue[(Int,Int)]()( Ordering.by {case (a,b) => (a, -b)} ),再加上一对括号。
  • 所以在您发布的示例中,您不需要显式列出 [(Int,Int)] 因为它是从您传入的参数中推断出来的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
相关资源
最近更新 更多