2

IteratorScalaの初心者として、式で取得および処理されるすべてのアイテムのカウンターと、for式の「ループ」の1つ(外側のループとネストされたループ)の新しい反復ごとにインクリメントされるカウンターを実装しようとしていますループ) が開始されます。counter = counter + 1要件は、式の多数の場所にステートメント like を配置するだけでなく、これを達成することですfor。次のリストは、この問題に対する私の提案された解決策を示しています。私は知りたいのですが、の抽象メンバーをnext実装するメソッドIteratorが呼び出される (および対応するカウンターがインクリメントされる) のに対し、 trait で定義されたペンダントflatMapをオーバーライドする(およびそれらを経由して呼び出す) ことはありません。全然呼んだ。mapIteratorsuper

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

誰かが与えられた問題をより良い方法で解決する方法のヒントを教えてくれたら幸いです. しかし、何よりも、私のソリューションが と をオーバーライドする理由を知りたいと思ってIteratormapますflatMap;-)

よろしく

マーティン

4

2 に答える 2

0

その間、私は自分で答えを見つけることができました。私の解決策の問題は、 withFilter が InstrumentedIterator ではなく、新しく作成された AbstractIterator への参照を返すことです。可能な解決策として、この参照を、InstrumentedIterator のようなラッパー クラスのコンストラクターに渡すことができます。これは、特性 Iterator を混合し、メソッド map および flatMap をオーバーライドします。これらのメソッドは、カウントを行うことができます...

よろしくマーティン

于 2015-04-27T21:50:50.783 に答える
-1

あなたのセリフ

List(...) <- Iterator

map と flatmap を呼び出さないでください。それらは、Iterator をタプルにアンパックする List コンパニオン オブジェクトで unapply を呼び出します。

map または flatMap を呼び出すには、次のようなものが必要です

item <- Iterator

unapply メソッドを使用して InstrumentedIter のコンパニオン オブジェクトを定義するか、理解のために map/flatMap 構文を使用する必要があります。

于 2015-04-18T14:03:26.410 に答える