Может быть, вы можете эффективно использовать span
и duplicate
. Предполагая, что итератор расположен в начале пакета, вы берете интервал перед следующим пакетом, дублируете его, чтобы можно было подсчитать страницы, написать измененную строку пакета, а затем записать страницы, используя дублированный итератор. Затем обработайте следующую партию рекурсивно ...
def batch(i: Iterator[String]) {
if (i.hasNext) {
assert(i.next() == "batch")
val (current, next) = i.span(_ != "batch")
val (forCounting, forWriting) = current.duplicate
val count = forCounting.filter(_ == "p").size
println("batch " + count)
forWriting.foreach(println)
batch(next)
}
}
Предполагая следующий ввод:
val src = Source.fromString("head\nbatch\np\np\nbatch\np\nbatch\np\np\np\n")
Вы размещаете итератор в начале пакета, а затем обрабатываете пакеты:
val (head, next) = src.getLines.span(_ != "batch")
head.foreach(println)
batch(next)
Это печатает:
head
batch 2
p
p
batch 1
p
batch 3
p
p
p