0

私はコードを持っています(ここにsentencesありiteratorます):

  def count() = {
    var count = 0
    for(sentence <- sentences.toStream) count += sentence.words.size
    count
  }

そしてテスト:

// first
val wordCount1 = wordCounter.count()
wordCount1 must_== 10

// second time - should be same result
val wordCount2 = wordCounter.count()
wordCount2 must_== 10   // fails: result is 0

最後のテストは失敗しました:

'0' is not equal to '10'
Expected :10
Actual   :0

しかし、私はsentences.toStream上記のコードで使用しているのでstream、それを持っていると思います (理論的には再利用できます)。

Q:なぜ失敗するのですか?


編集:toStreamそれが役立つ ことを望んでいました。ここで説明したように: (...「同じことをStream複数回トラバースできます...」 )。イテレータに触れたことがないようなものです。ストリームを扱っています。

でもsentences.toStream UP sentence-iteratorしてしまったのでもう使えません。イテレータ自体に触れずにイテレータへのストリーム「リンク」を取得するようなロジックを実行することを期待していtoStreamました。iteratorOk..

4

2 に答える 2

4

sentences Iteratorが消費されているため、失敗します。andメソッドIteratorを除いて、メソッドが呼び出された後に を呼び出すことは想定されていません。nexthasNext

簡単な例でこれを示します。

scala> val it = Iterator(1,2,3)
it: Iterator[Int] = non-empty iterator

scala> it.foreach(println(_))
1
2
3

scala> it.foreach(println(_))

scala> 

あなたの場合sentences、最初の呼び出しで消費され、2番目の呼び出しでは空で、サイズが0になります。

それを呼び出しtoStreamても、これは変わりません。空の が返されますStream。再利用したい場合は、カウントを呼び出す前にsentencesリストに割り当てます。val l = sentences.toList

于 2013-06-08T22:47:16.807 に答える
3

実際toStreamに役立ちます。2 回目以降のトラバースで「デッド」イテレータからストリームを作成しようとしないために、コードを expect に変更しましたstreamが、notに変更しました。iterator

次に、私の解決策は次のとおりです。

val stream = new SentenceFileReader("two_lines_file.txt").toStream

val wordCounter = new WordCounter(stream) // now it accepts stream but not iterator

// first
val wordCount1 = wordCounter.count()
wordCount1 must_== 10

// second time - same result
val wordCount2 = wordCounter.count()
wordCount2 must_== 10
于 2013-06-09T04:40:32.033 に答える