Comment écririez-vous une implémentation funcitonal em> pour Par exemple p>
Split (positions: liste [int], str: string): liste [string] code>, qui est similaire à
Splithat code> mais scindre une chaîne donnée dans une liste em> de chaînes par une liste donnée de positions? p>
divisé (liste (1, 2), "ABC") code> renvoie la liste
("A", "B", "C") CODE> LI>
divisé (liste (1), "ABC") code> renvoie la liste
("A", "BC") CODE> LI>
split (liste (), "abc") code> renvoie la liste
("abc") code> li>
ul>
3 Réponses :
quelque chose comme ceci:
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) }
Merci. Je vais faire une version récursive de la queue de votre solution.
@Michael - peut également vouloir envisager d'ajouter un index code> startat code> afin que vous puissiez s.substring (startat, x) :: lsplit (repos, s, startat + x) code> ( dans la version non récursive de la queue, bien sûr). Si vous le faites, n'oubliez pas le boîtier
nil code>.
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 }
Que diriez-vous de ....
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)
J'utiliserais une solution basée sur
substrant code> au lieu de
splitat code>. Le premier réutilisera la chaîne d'origine code> en mémoire de la mémoire, tandis que ce dernier copiera les chaînes en de nouvelles chaînes. Les solutions fournies peuvent être adaptées pour utiliser
sous-chaîne code>.