在Scala中分裂' - '

时间:2014-11-12 03:29:52

标签: string scala higher-order-functions

我需要返回两个列表,即字符串列表,包括第一行包含' - ',然后是剩余的元素。

所以我一直在尝试lst.splitAt(' - '),但它一直在做

 scala> val lst = List(" Hi this is - a test")
 lst: List[String] = List(" Hi this is - a test")

 scala> lst.splitAt('-')
 res8: (List[String], List[String]) = (List(" Hi this is - a test"),List())

我怎样才能解决这个问题,以便我得到(List(“嗨这是 - ),List(测试”))?

2 个答案:

答案 0 :(得分:7)

List的splitAt的参数是Int。你的' - '被强制为45并试图将该列表拆分为45。

您可以为单个字符串执行此操作:

"hello-test-string".split('-')

这个(在sbt中)的结果是:

res0: Array[String] = Array(hello, test, string)

如果需要,您可以在字符串列表上映射此函数:

List("hello-test-string", "some-other-cool-string").map(_.split('-').toList)

结果是:

res1: List[List[String]] = List(List(hello, test, string), List(some, other, cool, string))

答案 1 :(得分:2)

spanunzip一起考虑,

lst.map(_.span(_ != '-')).unzip

提供

(List(" Hi this is "),List("- a test"))

请注意span将一个集合(在本例中为列表中的每个字符串)一分为二,而不是第一个不符合条件的元素(此处与'-'相等)。

<强>更新

为了包含'-' char,我们可以在字符串上定义takeUntil方法,例如如下,

implicit class StringFetch(val s: String) extends AnyVal {
  def takeUntil(p: Char => Boolean) = {
    val (l,r) = s.span(p)
    val (rl,rr) = r.span(!p(_))
    l + rl
  }
}

因此

lst.map(_.takeUntil(_!= '-'))
res: List[String] = List(" Hi this is -")