gpt4 book ai didi

Scala - Iterator.toList 的奇怪行为

转载 作者:行者123 更新时间:2023-12-02 22:04:23 25 4
gpt4 key购买 nike

我是 Scala 的新手,我有一个函数如下:

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

从缓冲迭代器中仅选择与头部匹配的元素。我随后使用此代码:

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)
}

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

最佳答案

Iterator 的 Scaladoc 对 takeWhile 说:

Reuse: After calling this method, one should discard the iterator it was called on, and use only the iterator that was returned. Using the old iterator is undefined, subject to change, and may result in changes to the new iterator as well.

原来如此。这基本上意味着你不能直接用 IteratorstakeWhile 做你想做的事。恕我直言,最简单的方法是快速编写您自己的递归函数来执行此操作。

如果你想坚持使用 Iterators,你可以在 Iterator 上使用 sameElements 方法在你调用的地方生成一个副本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
}

关于Scala - Iterator.toList 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16361638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com