Как разбить строку по списку позиций в Scala - PullRequest
7 голосов
/ 28 ноября 2011

Как бы вы написали функциональную реализацию для 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 ]

5 голосов
/ 29 ноября 2011
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
}
4 голосов
/ 28 ноября 2011

Примерно так:

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 голосов
/ 06 ноября 2013

Как насчет ....

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...