8
votes

Comment diviser une chaîne donnée une liste de postes dans Scala

Comment écririez-vous une implémentation funcitonal pour Split (positions: liste [int], str: string): liste [string] , qui est similaire à Splithat mais scindre une chaîne donnée dans une liste de chaînes par une liste donnée de positions?

Par exemple

  • divisé (liste (1, 2), "ABC") renvoie la liste ("A", "B", "C")
  • divisé (liste (1), "ABC") renvoie la liste ("A", "BC")
  • split (liste (), "abc") renvoie la liste ("abc")

1 commentaires

J'utiliserais une solution basée sur substrant au lieu de splitat . Le premier réutilisera la chaîne d'origine 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 .


3 Réponses :


4
votes

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


2 commentaires

Merci. Je vais faire une version récursive de la queue de votre solution.


@Michael - peut également vouloir envisager d'ajouter un index startat afin que vous puissiez s.substring (startat, x) :: lsplit (repos, s, startat + x) ( dans la version non récursive de la queue, bien sûr). Si vous le faites, n'oubliez pas le boîtier nil .



6
votes
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
}

0 commentaires

2
votes

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)


0 commentaires