Iterator
Scalaの初心者として、式で取得および処理されるすべてのアイテムのカウンターと、for
式の「ループ」の1つ(外側のループとネストされたループ)の新しい反復ごとにインクリメントされるカウンターを実装しようとしていますループ) が開始されます。counter = counter + 1
要件は、式の多数の場所にステートメント like を配置するだけでなく、これを達成することですfor
。次のリストは、この問題に対する私の提案された解決策を示しています。私は知りたいのですが、の抽象メンバーをnext
実装するメソッドIterator
が呼び出される (および対応するカウンターがインクリメントされる) のに対し、 trait で定義されたペンダントflatMap
をオーバーライドする(およびそれらを経由して呼び出す) ことはありません。全然呼んだ。map
Iterator
super
object ZebraPuzzle {
var starts = 0
var items = 0
class InstrumentedIter[A](it: Iterator[A]) extends Iterator[A] {
private val iterator = it
def hasNext = it.hasNext
def next() = {
items = items + 1
it.next()
}
override def flatMap[B](f: (A) ⇒ GenTraversableOnce[B]): Iterator[B] = {
starts = starts + 1
super.flatMap(f)
}
override def map[B](f: (A) ⇒ B): Iterator[B] = {
starts = starts + 1
super.map(f)
}
} // inner class InstrumentedIter
対応するfor
式は次のようになります。
def solve = {
val first = 1
val middle = 3
val houses = List(first, 2, middle, 4, 5)
for {
List(r, g, i, y, b) <- new InstrumentedIter(houses.permutations)
if ...
List(eng, span, ukr, jap, nor) <- new InstrumentedIter(houses.permutations)
if ...
if ...
if ...
List(of, tea, milk, oj, wat) <- new InstrumentedIter(houses.permutations)
if ...
...
} yield ...
...
}
...
} // standalone singleton object ZebraPuzzle
誰かが与えられた問題をより良い方法で解決する方法のヒントを教えてくれたら幸いです. しかし、何よりも、私のソリューションが と をオーバーライドする理由を知りたいと思ってIterator
いmap
ますflatMap
;-)
よろしく
マーティン