我需要返回两个列表,即字符串列表,包括第一行包含' - ',然后是剩余的元素。
所以我一直在尝试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(测试”))?
答案 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)
将span
和unzip
一起考虑,
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 -")