2013-02-17 24 views
12

私はScala(バージョン2.10)でA *検索を実装しようとしていますが、レンガの壁にぶつかりました。スカラの優先度キューの使い方を理解できません。それは単純な仕事のようですが、Googleで検索しても何も表示されませんでした(バージョン2.8での作業を停止した単一のコードサンプルを除いて)Scalaでプライオリティキューを使用するには?

私は(Int, Int)で表される四角形のセットを持っていますIntで表される優先順位で挿入する必要があります。 Pythonでは、キーと値のペアの一覧があり、heapq関数を使用して並べ替えるだけなので、かなりシンプルです。しかし、Scalaのタプルは同等ではないようです。

どうやってこれを行うのですか?私はオンライン情報が完全に欠如していることに驚いています。

答えて

17

実際pre-defined lexicographical order for tuplesあり - but you need to import it

import scala.math.Ordering.Implicits._ 

また、あなた自身の順序を定義することができます。 は、タプルの第1および第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)) 
+1

ありがとうございます。前に 'scala.math.Ordering.Implicits._'をインポートしようとしましたが、私は期間を逃しました。 – Antimony

+2

@Antimonyしてください、編集を参照してください。私は+ =操作であなたを間違ってしまいました。あなたは '.enqueue'を使う必要があります。 –

0

実際、整数の組(a、b)に暗黙の順序はありません。それはどうなりますか?おそらく彼らはどちらもポジティブで、あなたは(a-1.0/b)を使うことができますか?または、彼らは、あなたが使用することができます、何、(a + atan(b/pi))?ご注文をお考えの場合は、ご注文のあるタイプのペアをラッピングすることを検討することができます。

+0

まあ自然な順序はC++とPythonは何をすべきかである、辞書式です。 Scalaを仮定するための愚かな私は少なくともC++と同じくらい機能的です。 – Antimony

+0

@Antimony:明確にする:C++言語とその標準ライブラリ自体にこの順序が含まれていますか? –

+1

はい。 http://www.cplusplus.com/reference/tuple/operators/ – Antimony

関連する問題