Tôi có một trình vòng lặp của chuỗi, trong đó mỗi chuỗi có thể là "H"
(tiêu đề) hoặc "D"
(chi tiết). Tôi muốn chia iterator này thành các khối, trong đó mỗi khối bắt đầu bằng một tiêu đề và có thể có 0 đến nhiều chi tiết.
Tôi biết làm thế nào để giải quyết vấn đề này tải mọi thứ vào bộ nhớ. Ví dụ, mã dưới đây:
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
trả về 5 khối - List(List(H, D, D, D), List(H, D), List(H), List(H, D, D), List(H, D))
- đó là những gì tôi muốn.
Tuy nhiên, thay vì List[List[String]]
trong kết quả, tôi muốn một Iterator[List[String]]
hoặc một số cấu trúc khác cho phép tôi đánh giá kết quả một cách lười biếng và không tải toàn bộ đầu vào vào bộ nhớ nếu toàn bộ iterator bị tiêu thụ , tôi chỉ muốn tải vào bộ nhớ tại một thời điểm (ví dụ: khi tôi gọi iterator.next
).
Làm cách nào để sửa đổi mã ở trên để đạt được kết quả tôi muốn?
EDIT: Tôi cần điều này trong Scala 2.11, vì môi trường tôi sử dụng dính vào nó. Vui mừng cũng chấp nhận câu trả lời cho các phiên bản khác mặc dù.