除了Scala迭代器中的最后一项(a.k.a。Iterator.init)之外的所有项目

时间:2010-08-18 11:49:32

标签: scala iterator

我有很多大文件要处理除了每个文件中的最后一行以外的所有文件。如果文件很小,我可以转换为TraversableLike并使用“init”方法,例如:

lines.toList.init

但是文件很大所以我需要将事物保存为迭代器。有没有一种简单的方法可以在迭代器上获得类似“init”的内容?我正在考虑以下内容,但我不相信它会一直有效:

lines.takeWhile(_ => lines.hasNext)

2 个答案:

答案 0 :(得分:14)

你首先依靠takeWhile抓住下一行,然后检查是否还有另一行。它在默认迭代器中以这种方式工作。对于任何特定的迭代器,我希望如果它能够工作,它应该始终有效。

如果失败,您需要缓存结果。您可以创建自己的迭代器,或者更容易(如果这不是紧急的性能关键代码):

lines.sliding(2).map(_.head)

按如下方式测试:

List(1,2,3,4,5).iterator.sliding(2).map(_.head).toList

您不必依赖takeWhile或以任何特定方式行事的任何其他方法;如果sliding没有被破坏,它将具有上述行为。

答案 1 :(得分:6)

如果您想跳过前两行,并删除最后4行,则可以使用

进行迭代
List(1, 2, 3).toIterable.drop(1).dropRight(1)

如果您已经拥有IterableLike

il.drop(1).dropRight(1)