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

如何在Scala中使用优先级队列?,scala,tuples,priority-queue,scala-collections,Scala,Tuples,Priority Queue,Scala Collections,我试图在Scala(2.10版)中实现*搜索,但我遇到了一个难题——我不知道如何使用Scala的优先级队列。这似乎是一项简单的任务,但在谷歌上搜索并没有发现任何东西(除了一个在2.8版中停止工作的代码示例) 我有一组正方形,用(Int,Int)s表示,我需要用Ints表示的优先级插入它们。在Python中,它非常简单,因为您只有一个键、值对列表,并使用heapq函数对其进行排序。但Scala的元组似乎甚至不具有可比性 那你是怎么做到的?考虑到在线信息的简单程度,我对完全缺乏在线信息感到惊讶。事实

我试图在Scala(2.10版)中实现*搜索,但我遇到了一个难题——我不知道如何使用Scala的优先级队列。这似乎是一项简单的任务,但在谷歌上搜索并没有发现任何东西(除了一个在2.8版中停止工作的代码示例)

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


那你是怎么做到的?考虑到在线信息的简单程度,我对完全缺乏在线信息感到惊讶。

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

实际上有:--/P> 此外,您还可以定义自己的顺序。 假设我想根据元组的第一个和第二个成员之间的差异来排列元组:

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))

自然排序是词典编纂,这是C++和Python所做的。愚蠢的假设斯卡拉至少和C++一样有功能。@安蒂莫尼:澄清一下:C++语言及其标准库本身包含这个排序?谢谢。我以前尝试导入
scala.math.Ordering.Implicits.\u
但错过了一个句号。@请参见编辑。我用+=操作误导了您,您必须使用
.enqueue
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))