如何在Scala中使用优先级队列?

时间:2013-02-17 23:30:40

标签: scala tuples priority-queue scala-collections

我正在尝试在Scala(版本2.10)中实现A *搜索,但我遇到了一堵砖墙 - 我无法弄清楚如何使用Scala的优先级队列。这似乎是一项简单的任务,但在谷歌搜索没有发现任何东西(除了在2.8版本中停止工作的单个代码示例)

我有一组由(Int, Int) s表示的正方形,我需要插入由Int s表示的优先级。在Python中它很简单,因为你只有一个键值对的列表,并使用heapq函数对它进行排序。但看起来Scala的元组甚至不具有可比性。

那你怎么做的?鉴于它应该是多么简单,我对完全缺乏在线信息感到惊讶。

2 个答案:

答案 0 :(得分:20)

实际上有pre-defined lexicographical order for tuples - but you need to import it

import scala.math.Ordering.Implicits._

此外,您可以定义自己的订购。 假设我想根据元组的第一个和第二个成员之间的差异来安排元组:

scala> import scala.collection.mutable.PriorityQueue
//  import scala.collection.mutable.PriorityQueue

scala> def diff(t2: (Int,Int)) = math.abs(t2._1 - t2._2)
// diff: (t2: (Int, Int))Int

scala> val x = new PriorityQueue[(Int, Int)]()(Ordering.by(diff))
// x: scala.collection.mutable.PriorityQueue[(Int, Int)] = PriorityQueue()

scala> x.enqueue(1 -> 1)

scala> x.enqueue(1 -> 2)

scala> x.enqueue(1 -> 3)

scala> x.enqueue(1 -> 4)

scala> x.enqueue(1 -> 0)

scala> x
// res5: scala.collection.mutable.PriorityQueue[(Int, Int)] = PriorityQueue((1,4), (1,3), (1,2), (1,1), (1,0))

答案 1 :(得分:0)

实际上,对整数对(a,b)没有隐式排序。会是什么?也许他们都是积极的,你可以使用(a - 1.0 / b)?或者他们不是,你可以使用什么,(a + atan(b / pi))?如果您有一个订购,您可以考虑将您的货币对包装在您订购的类型中。