0

我有一个代码(sentencesiterator这里):

  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它是(理论上我可以重用它)。

问:为什么会失败?


编辑: 我希望这toStream会有所帮助。就像这里Stream描述的那样:(...“您可以多次遍历相同的内容”...)。就像我从不接触迭代器一样,我处理的是流。

但是我得到了..sentences.toStream 用完 sentence-iterator了,所以我不能再使用它了。我只是期望在做toStream的时候iterator做一个逻辑,比如在不触及迭代器本身的情况下将流“链接”到迭代器。行..

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,第一次调用已花费,第二次调用为空,大小为 0。

调用toStream它不会改变这一点。你得到一个空的Stream。如果您想在调用 count 之前将其重新sentences分配给一个列表。val l = sentences.toList

于 2013-06-08T22:47:16.807 回答
3

其实有toStream帮助。我只是将代码更改为 expectstream但不是iterator,以便不尝试在 second+ 遍历时从“死”迭代器创建流。

那么我的解决方案是:

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 回答