Есть ли комбинация takeWhile, dropWhile в Scala?
В Scala я хочу разбить строку на конкретный символ следующим образом:
scala> val s = "abba.aadd"
s: String = abba.aadd
scala> val (beforeDot,afterDot) = (s takeWhile (_!='.'), s dropWhile (_!='.'))
beforeDot: String = abba
afterDot: String = .aadd
Это решение немного неэффективно (возможно, не асимптотически), но я чувствую, что в стандартной библиотеке уже есть что-то вроде этого. Любые идеи?
Ответы
Ответ 1
Существует метод span
:
scala> val (beforeDot, afterDot) = s.span{ _ != '.' }
beforeDot: String = abba
afterDot: String = .aadd
Из Scala документация:
c span p
эквивалентен (но, возможно, более эффективен, чем) (c takeWhile p, c dropWhile p)
, если оценка предиката p не вызывает никаких побочных эффектов.
Ответ 2
Вы можете использовать splitAt
для того, что вы хотите:
val s = "abba.aadd"
val (before, after) = s.splitAt(s.indexOf('.'))
Вывод:
before: String = abba
after: String = .aadd