Для начала каждая строка в вашем списке содержит пробелы от начала строки.
Это самая большая проблема в вашем коде, и есть два способа ее исправить.
Либо обрезать линии ...
val list1 =
"""992
1010
...
1306
1469""".lines.map(_.trim).toList
... или перед каждой строкой можно указать |
и использовать stripMargin
.
Тогда это всего лишь маленький вопрос применения takeWhile
/ dropWhile
list1.takeWhile("BEGIN" !=) ++ list1.dropWhile("END"!=).tail
или более эффективно:
val (begin,middle) = list1.span("BEGIN" !=)
val end = middle.dropWhile("END" !=).tail
begin ++ end
EDIT
У меня было решение задом наперед, которое отбросило бы (отфильтровало) значения между BEGIN
и END
. Чтобы сохранить их:
list1.dropWhile("BEGIN" !=).tail.takeWhile("END"!=)
РЕДАКТИРОВАТЬ 2
Принимая вызов здесь ... Я учту несколько блоков BEGIN / END, но также учту, что входные данные могут быть неправильно искажены. Что если бы было НАЧАЛО без соответствующего КОНЦА? Возможно, в строке два BEGIN, или список заканчивается до того, как закончится END.
Определение некоторых правил:
- КОНЕЦ без соответствующего НАЧАЛА игнорируется
- блоки BEGIN / END не вкладываются
- НАЧАЛО, обнаруженное, когда уже в блоке начинается новый блок
- Если список заканчивается в блоке, подразумевается неявный END
Без лишних слов сначала создайте итератор, который идентифицирует каждый "BEGIN"
во входных данных:
val blocksStarts =
Iterator.iterate(list1)(_.dropWhile("BEGIN" !=).drop(1)).drop(1).takeWhile(Nil !=)
//This iterator tries to continue forever,
//returning Nils once the sequences are exhausted
//For this reason, we must use drop(1) instead of tail
Предоставление итератора списков, каждый из которых начинается с "BEGIN"
Чтобы затем брать элементы из каждого из этих списков, пока не будет достигнут соответствующий "END"
, или другой "BEGIN"
, или список не будет исчерпан:
val blocks = blockStarts map {
_.takeWhile(x => x != "BEGIN" && x != "END")
} toList
Финал toList
- потому что на тот момент он все еще равен Iterator
. Теперь у вас есть список списков, каждый из которых соответствует партии элементов в блоке, как определено в предыдущих правилах.