2011-11-28 10 views
6

¿Cómo escribir una aplicación funcitonal para split(positions:List[Int], str:String):List[String], que es similar a splitAt pero divide una cadena dada en una lista de cadenas de una lista dada de posiciones ?¿Cómo dividir una cadena dada una lista de posiciones en la Scala

Por ejemplo

  • split(List(1, 2), "abc") vuelve List("a", "b", "c")
  • split(List(1), "abc") devuelve List("a", "bc")
  • split(List(), "abc") vuelve List("abc")
+1

que haría uso de una solución basada en 'subcadena 'en lugar de' splitAt'. El primero reutilizará el 'Cadena' original en la memoria, mientras que el último copiará las cadenas en nuevas cadenas. Las soluciones proporcionadas se pueden adaptar para usar 'substring'. –

Respuesta

4
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

algo como esto:

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) 
} 

(Advertencia de advertencia: no recursivo de la cola, por lo que explotará la pila para listas grandes; no eficiente debido a repetidas reasignaciones de índices y cadenas de subcadenas. Puede resolver estas cosas mediante la adición de argumentos adicionales y/o un método interno que hace la recursividad.)

+0

Gracias. Voy a hacer una versión recursiva de la cola de tu solución. – Michael

+2

@Michael - También podría considerar agregar un índice 'startAt' para que pueda' s.substring (startAt, x) :: lsplit (rest, s, startAt + x) '(en la versión no recursiva, por supuesto). Si lo haces, no olvides el caso 'Nil'. –

2

¿Qué tal ....

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) 
Cuestiones relacionadas