17

Scala(バージョン2.10)でA *検索を実装しようとしていますが、レンガの壁にぶつかりました-Scalaの優先キューの使用方法がわかりません。簡単な作業のように見えますが、Googleで検索しても何も見つかりませんでした(バージョン2.8で機能しなくなった単一のコードサンプルを除く)

sで表される一連の正方形があり、(Int, Int)sで表される優先順位でそれらを挿入する必要がありIntます。Pythonでは、キーと値のペアのリストがあり、heapq関数を使用してソートするだけなので、非常に簡単です。しかし、Scalaのタプルは比較できないようです。

では、これをどのように行うのですか?オンライン情報がいかにシンプルであるべきかを考えると、オンライン情報が完全に不足していることに驚いています。

4

2 に答える 2

25

タプルには実際には事前定義された辞書式順序ありますが、インポートする必要があります

import scala.math.Ordering.Implicits._

さらに、独自の順序を定義できます。タプルの最初のメンバーと2番目のメンバーの違いに基づいて、タプルを配置したいとします。

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))
于 2013-02-17T23:48:17.160 に答える
0

実際、整数のペア(a、b)には暗黙の順序付けはありません。それはどうなりますか?おそらくそれらは両方ともポジティブであり、あなたは(a --1.0 / b)を使うことができますか?または、そうではなく、何を使用できますか(a + atan(b / pi))?注文を念頭に置いている場合は、注文のあるタイプでペアをラップすることを検討できます。

于 2013-02-17T23:45:49.220 に答える