您如何为split(positions:List[Int], str:String):List[String]
编写功能实现,类似于splitAt
,但将给定字符串拆分为字符串的列表通过给定的职位列表?
例如
split(List(1, 2), "abc")
返回List("a", "b", "c")
split(List(1), "abc")
返回List("a", "bc")
split(List(), "abc")
返回List("abc")
答案 0 :(得分:5)
def lsplit(pos: List[Int], str: String): List[String] = {
val (rest, result) = pos.foldRight((str, List[String]())) {
case (curr, (s, res)) =>
val (rest, split) = s.splitAt(curr)
(rest, split :: res)
}
rest :: result
}
答案 1 :(得分:4)
这样的事情:
def lsplit(pos: List[Int], s: String): List[String] = pos match {
case x :: rest => s.substring(0,x) :: lsplit(rest.map(_ - x), s.substring(x))
case Nil => List(s)
}
(公平警告:不是尾递归所以会为大型列表烧掉堆栈;由于重复重新映射索引和子串链而无效。你可以通过添加额外的参数和/或内部方法来解决这些问题。递归。)
答案 2 :(得分:2)
怎么样......
def lSplit( indices : List[Int], s : String) = (indices zip (indices.tail)) map { case (a,b) => s.substring(a,b) }
scala> lSplit( List(0,4,6,8), "20131103")
List[String] = List(2013, 11, 03)