在Scala中是否有takeWhile,dropWhile的组合?

时间:2014-05-06 08:00:42

标签: string scala split standard-library

在Scala中,我想将字符串拆分为特定字符,如下所示:

scala> val s = "abba.aadd" 
s: String = abba.aadd
scala> val (beforeDot,afterDot) = (s takeWhile (_!='.'), s dropWhile (_!='.'))
beforeDot: String = abba
afterDot: String = .aadd

这个解决方案效率稍低(可能不是渐近),但我觉得标准库中可能存在这样的问题。有什么想法吗?

2 个答案:

答案 0 :(得分:42)

span方法:

scala> val (beforeDot, afterDot) = s.span{ _ != '.' }
beforeDot: String = abba
afterDot: String = .aadd

来自Scala documentation

  

c span p等同于{但可能比(c takeWhile p, c dropWhile p)更有效,前提是对谓词p的评估不会产生任何副作用。

答案 1 :(得分:3)

您可以根据需要使用splitAt

val s = "abba.aadd"
val (before, after) = s.splitAt(s.indexOf('.'))

输出:

before: String = abba
after: String = .aadd