Scala - Iterator.toList的奇怪行为

use*_*218 2 iterator scala

我是Scala的新手,我的功能如下:

def selectSame(messages: BufferedIterator[Int]) = {
  val head = messages.head
  messages.takeWhile(_ == head)
}
Run Code Online (Sandbox Code Playgroud)

这是从缓冲迭代器中选择只匹配头部的元素.我随后使用此代码:

val messageStream = List(1,1,1,2,2,3,3)
if (!messageStream.isEmpty) {
  var lastTimeStamp = messageStream.head.timestamp
  while (!messageStream.isEmpty) {
    val messages = selectSame(messageStream).toList
    println(messages)
}
Run Code Online (Sandbox Code Playgroud)

在第一次执行时,我按预期得到(1,1,1),但后来我只得到了List(2),好像我丢失了一行元素...可能我对迭代器/列表做错了,但我在这里有点迷失.

gzm*_*zm0 5

斯卡拉多克IteratortakeWhile:

重用:在调用此方法之后,应该丢弃它被调用的迭代器,并仅使用返回的迭代器.使用旧迭代器是未定义的,可能会发生更改,并且可能也会导致对新迭代器进行更改.

所以这就是为什么.这基本上意味着你不能直接做你想要的IteratorstakeWhile.恕我直言,最简单的是快速编写自己的递归函数来做到这一点.

如果你想坚持下去Iterators,你可以使用它上面的sameElements方法Iterator生成你要调用的副本dropWhile.

更好:span反复使用:

def selectSame(messages: BufferedIterator[Int]) = {
  val head = messages.head
  messages.span(_ == head)
}

def iter(msgStream: BufferedIterator[Int]): Unit = if (!msgStream.isEmpty) {
  val (msgs, rest) = selectSame(msgStream)
  println(msgs.toList)
  iter(rest)
}

val messageStream = List(1,1,1,2,2,3,3)
if (!messageStream.isEmpty) {
  var lastTimeStamp = messageStream.head.timestamp
  iter(messageStream0
}
Run Code Online (Sandbox Code Playgroud)