Ich habe einen Iterator von Zeichenfolgen, wobei jede Zeichenfolge entweder "H"
(Header) oder "D"
(Detail) sein kann. Ich möchte diesen Iterator in Blöcke aufteilen, wobei jeder Block mit einem Header beginnt und 0 bis viele Details haben kann.
Ich weiß, wie man dieses Problem löst, indem man alles in den Speicher lädt. Zum Beispiel der folgende Code:
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
gibt 5 Blöcke zurück - List(List(H, D, D, D), List(H, D), List(H), List(H, D, D), List(H, D))
- was ich will.
Anstelle des List[List[String]]
Ergebnisses möchte ich jedoch eine Iterator[List[String]]
oder eine andere Struktur, mit der ich das Ergebnis träge auswerten und nicht die gesamte Eingabe in den Speicher laden kann, wenn der gesamte Iterator verbraucht ist. Ich möchte nur den Block in den Speicher laden, der verbraucht wird zu einem Zeitpunkt (zB: wenn ich anrufe iterator.next
).
Wie kann ich den obigen Code ändern, um das gewünschte Ergebnis zu erzielen?
EDIT: Ich brauche dies speziell in Scala 2.11, da die Umgebung, die ich benutze, daran festhält. Ich bin froh, auch Antworten für andere Versionen zu akzeptieren.