Как использовать приоритетные очереди в Scala?
Я пытаюсь реализовать поиск* в Scala (версия 2.10), но я столкнулся с кирпичной стеной - я не могу понять, как использовать приоритетную очередь Scala. Это кажется простой задачей, но поиск в Google ничего не обнаружил (за исключением одного образца кода, который перестал работать в версии 2.8)
у меня есть набор квадратов, представленное (Int, Int)
s, и мне нужно вставить их с приоритетами, представленными Int
s. В Python это довольно просто, так как у вас просто есть список пар ключ, значение и использовать функции heapq для сортировки. Но похоже, что кортежи Scala даже не сопоставимы.
Итак, как вы это делаете? Я удивлен полным отсутствием информации в интернете, учитывая, насколько это должно быть просто.
2 ответов
есть на самом деле предварительно определенный лексикографический порядок для кортежей -- но вам нужно импортировать его:
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))
действительно, нет неявного упорядочения на парах целых чисел (a, b). Что бы это могло быть? Возможно, они оба положительные, и вы можете использовать (a-1.0 / b)? Или их нет, и вы можете использовать, что, (A + atan (b/pi))? Если у вас есть заказ в виду, вы можете рассмотреть возможность упаковки ваших пар в тип, который имеет ваш заказ.