2015-08-23 2 views
2

У меня есть файл, который состоит из групп строк. Каждая группа представляет событие. Конец группы обозначается «END». Я могу думать о том, чтобы использовать цикл for для циклического прохождения строк, хранить промежуточные строки и выделять группу, когда встречается «END».Лучший способ чтения строк в группах в плоском файле

Но, поскольку я хотел бы сделать это в Скале. Мне интересно, может ли кто-нибудь предложить более функциональный способ сделать то же самое?

---------- 
A 
B 
C 
END 
---------- 
D 
E 
F 
END 
---------- 

ответ

7

Просто определить итератор для возврата группам

def groupIterator(xs:Iterator[String]) = 
    new Iterator[List[String]] 
    { def hasNext = xs.hasNext; def next = xs.takeWhile(_ != "END").toList} 

Testing (с Iterator[String], но Source.getLines возвратит вас итератор для строк файла)

val str = """ 
A 
B 
C 
END 
D 
E 
F 
END 
""".trim 

for (g <- groupIterator(str.split('\n').toIterator)) println(g) 
               //> List(A, B, C) 
               //| List(D, E, F) 
+0

Благодаря это намного короче и легче, чем я ожидал – defoo

Смежные вопросы