gpt4 book ai didi

scala - 如何将迭代器中的项目 T 分组到 Iterator[Seq[T]]

转载 作者:行者123 更新时间:2023-12-01 09:37:46 25 4
gpt4 key购买 nike

例如,考虑一个小文件。

one
two
three

four
five

six
seven
eight
nine

我想编写的代码将采用行迭代器 it: Iterator[String] 并创建一个迭代器 sectionIt: Iterator[Seq[String]]在各个部分。

在 C# 和 Ruby 中,这可以使用 yield 关键字轻松完成。有 talk of how to add that keyword to scala ,但这取决于编译器插件。

创建 sectionIt 的一种方法是直接创建一个 Iterator[Seq[String]] 并覆盖 nexthasNext 。对于像 Scala 这样的高级语言,这种方法似乎乏味且状态密集。

我意识到流式数据还有其他抽象,例如 Iteratees,这可能会使这更容易,但对于正在学习一门新语言的人来说,这并不是一件容易的事。

在 Scala 中编写上述代码的好方法是什么?

最佳答案

另一个答案的版本略有不同:

  def section(it: Iterator[String]): Iterator[Seq[String]] = { 
def spanned(it: Iterator[String]): Stream[Seq[String]] =
if (!it.hasNext) Stream.empty
else { val (a, b) = it span (_ != "") ; a.toSeq #:: spanned(b drop 1) }
spanned(it).iterator
}

它有点懒惰,在空白行之间读取的行为是不同的:

scala> lazysplit.Test.splitOnBlankLines(f"%n%n%n%n%n".lines).size
res0: Int = 6

scala> lazysplit.Test.section(f"%n%n%n%n%n".lines).size
res1: Int = 5

关于scala - 如何将迭代器中的项目 T 分组到 Iterator[Seq[T]],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23771248/

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