ScalaでProject Euler(22)

Problem 12

Pythonで書いたコードをScalaにします。

Ordering

val pq = new PriorityQueue[(Int,List[Int])]

とすると怒られます。List[Int]が比較できないからのようです。このようなときは自前の比較のためのオブジェクトを与えます。

import scala.collection.mutable.PriorityQueue

val o = Ordering[Int].on[(Int,_)](_._1)
val pq = new PriorityQueue[(Int,_)]()(o)
pq.enqueue((2, List(1)))
pq.enqueue((4, List(2)))
pq.enqueue((6, List(1, 1)))
println (pq.dequeue)        // (6,List(1, 1))

これで怒られなくなりました。型の一部を省略できるんですね。でもScalaのPriorityQueueは降順でしたね。

val o = Ordering[Int].on[(Int,_)](-_._1)

これで昇順になります。