2011-11-28 4 views
6

Come si scrive un'implementazione funcitonal per split(positions:List[Int], str:String):List[String], che è simile a splitAt ma divide una data stringa in un lista di stringhe da un determinato elenco di posizioni ?Come dividere una stringa data una lista di posizioni a Scala

Per esempio

  • split(List(1, 2), "abc") rendimenti List("a", "b", "c")
  • split(List(1), "abc") restituisce List("a", "bc")
  • split(List(), "abc") rendimenti List("abc")
+1

userei una soluzione basata su 'sottostringa 'invece di' splitAt'. Il primo riutilizza la stringa 'originale' in memoria, mentre il secondo copia le stringhe in nuove stringhe. Le soluzioni fornite possono essere adattate per utilizzare la 'sottostringa'. –

risposta

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

qualcosa di simile:

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

(Avviso equo: non coda ricorsiva quindi farà saltare la pila per le liste di grandi dimensioni; non efficiente a causa del ripetuto remapping di indici e catene di sottostringhe. È possibile risolvere queste cose con l'aggiunta di ulteriori argomenti e/o un metodo interno che fa la ricorsione.)

+0

Grazie. Farò una versione ricorsiva della tua soluzione. – Michael

+2

@ Michael - Potrebbe anche prendere in considerazione l'aggiunta di un indice 'startAt' in modo da poter' s.substring (startAt, x) :: lsplit (rest, s, startAt + x) '(nella versione ricorsiva non-tail, ovviamente). Se lo fai, non dimenticare il caso 'Nil'. –

2

ne dite ....

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) 
Problemi correlati