如何在给定Scala中的位置列表的情况下拆分字符串

时间:2011-11-28 17:35:27

标签: string scala collections

您如何为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")

3 个答案:

答案 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)