У меня есть итератор строк, где каждая строка может быть либо "H"
(заголовок), либо "D"
(подробно). Я хочу разделить этот итератор на блоки, где каждый блок начинается с одного заголовка и может содержать от 0 до многих деталей.
Я знаю, как решить эту проблему, загружая все в память. Например, код ниже:
Seq("H","D","D","D","H","D","H","H","D","D","H","D").toIterator
.foldLeft(List[List[String]]())((acc, x) => x match {
case "H" => List(x) :: acc
case "D" => (x :: acc.head) :: acc.tail })
.map(_.reverse)
.reverse
возвращает 5 блоков - List(List(H, D, D, D), List(H, D), List(H), List(H, D, D), List(H, D))
- что я и хочу.
Однако вместо List[List[String]]
в результате я хочу либо Iterator[List[String]]
, либо некоторую другую структуру, которая позволяет мне лениво оценивать результат, и не загружает весь ввод в память, если весь итератор в потребляемом , я хочу загрузить в память только блок, потребляемый за один раз (например: когда я вызываю iterator.next
).
Как я могу изменить приведенный выше код для достижения желаемого результата?
РЕДАКТИРОВАТЬ: Мне это нужно, в частности, Scala 2.11, поскольку среда, которую я использую, придерживается его. Рад также принимать ответы для других версий.