我是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),好像我丢失了一行元素...可能我对迭代器/列表做错了,但我在这里有点迷失.
斯卡拉多克Iterator说takeWhile:
重用:在调用此方法之后,应该丢弃它被调用的迭代器,并仅使用返回的迭代器.使用旧迭代器是未定义的,可能会发生更改,并且可能也会导致对新迭代器进行更改.
所以这就是为什么.这基本上意味着你不能直接做你想要的Iterators和takeWhile.恕我直言,最简单的是快速编写自己的递归函数来做到这一点.
如果你想坚持下去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)
| 归档时间: |
|
| 查看次数: |
186 次 |
| 最近记录: |