【问题标题】:Is there a combination of takeWhile,dropWhile in Scala?在 Scala 中是否有 takeWhile、dropWhile 的组合?
【发布时间】:2014-06-22 17:40:54
【问题描述】:

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

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

这个解决方案效率有点低(可能不是渐近的),但我感觉标准库中可能已经存在类似的东西。有什么想法吗?

【问题讨论】:

  • 不应该有split 函数吗?那会更干净。还是保持. 重要?

标签: string scala split standard-library


【解决方案1】:

有一个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 的评估不会导致任何副作用。

【讨论】:

  • 好吧,我不可能要求任何更接近我的问题的东西 :)
【解决方案2】:

您可以使用splitAt 来满足您的需求:

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

输出:

before: String = abba
after: String = .aadd

【讨论】:

  • 遍历序列两次,虽然
  • 不一定。取决于 Scala 优化器。
  • 我认为值得一提的是,如果可能,应该避免访问序列的索引,原因是随机访问容易出现一次性错误,并且很少适合函数式编程中的组合(这是基于我的经验)。随机访问发挥作用的地方通常是性能优化,其中数组通常是目标数据结构。
  • splitAt 用于takedropspan 用于takeWhiledropWhile
猜你喜欢
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 2018-09-13
  • 2019-01-06
  • 2021-04-02
  • 2017-11-04
  • 2013-04-27
相关资源
最近更新 更多