如何在Scala中使用优先级队列?(How to use priority queues in Sc

2019-08-17 01:06发布

我想实现在斯卡拉(2.10版本)A *搜索,但我已经遇到了一个砖墙 - 我无法弄清楚如何使用Scala的优先级队列。 这似乎是一个简单的任务,但搜索在谷歌没来任何东西(除了停止单一的代码示例2.8版工作回)

我有一组方形的,表示为(Int, Int) S,我需要与所代表的优先级将它们插入Int秒。 在Python这是很简单,因为你只需要密钥,值对的列表,并使用heapq功能对它进行排序。 但现在看来,Scala的元组甚至没有可比性。

那么,你如何做到这一点? 我是由完全缺乏网上信息感到惊讶,因为它应该是多么简单。

Answer 1:

这里实际上是预先定义的字典序元组 - 但你需要导入它 :

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


Answer 2:

的确,在对的整数隐式顺序(A,B)。 那会是什么? 也许他们都是积极的,你可以使用(A - 1.0 / B)? 或者,他们都没有了,你可以用,什么,(A + ATAN(B / PI))? 如果你心里有一个排序,你可以考虑在有您的订购一类包装一下你对。



文章来源: How to use priority queues in Scala?