Je suis un débutant à Scala, je vais simplement écrire une fonction simple pour inverser une chaîne donnée: Le rendement redonne un scala.collection.Immutable.indexedseq [Char ], et ne peut pas le convertir en une chaîne. (ou est-ce quelque chose d'autre?) p> Comment écrire cette fonction? p> p>
6 Réponses :
Notez qu'il existe une fonction déjà définie: mais si vous voulez le faire par vous-même: p> ou (parfois Il est préférable d'utiliser aussi, notez que si vous utilisez le comptage inversé (de plus grand à moins une valeur) Vous devez spécifier une étape négative ou obtenir un ensemble vide: p> jusqu'à code>, mais probablement pas dans ce cas) p>
merci om-nom-nom, je veux la mettre en œuvre moi-même pour que je puisse apprendre :)
Comme indiqué par OM-NOM-NOM, faites attention au Il peut également être fourni au l'avantage de l'utilisation de Remarque: par -1 code> (sinon, vous n'êtes pas vraiment itération et que votre résultat sera vide). L'autre astuce que vous pouvez utiliser est Collection.BreakLut Code> a >. pour code> compréhension comme suit: p> Breakout code> est qu'il évitera de créer une structure intermédiaire comme dans la solution mkstring code>. p> Breakout code> est levier CANBUILDDOM code > et les constructeurs qui font partie de la fondation de la bibliothèque de collecte redessinée introduits dans SCALA 2.8.0 EM> P> P>
Vous pouvez également écrire cela à l'aide d'une approche récursive (jetant celui-ci en juste pour le plaisir)
Cela ne sera pas optimisé
Voici une version courte
def reverse(s: String) = ("" /: s)(_.+:(_))
Salut Luigi, pouvez-vous donner une courte explication de votre code? Merci
J'aimerais avoir pensé à celui-ci. @ Dzhu c'est juste à l'aide d'un replierftft code> ( /: code> est juste un nom courte pour cette méthode) qui prend une valeur initiale, puis applique un opérateur à chaque valeur d'un séquence de gauche à droite. Dans ce cas, la séquence est la chaîne et l'opérateur ne fait que préparer les caractères de la chaîne au résultat.
@ Dzhu "" /: s code> est une méthode appelée dans la notation d'infixe. L'appel est sur s code> avec argument "" code> depuis la méthode /: code> se termine dans : code>. Si vous recherchez une chaîne dans les documents Scala, vous ne le trouverez pas puisqu'il s'agissait que de la classe Java, mais vous trouverez stringops code> dans lequel les chaînes sont implicitement converties et vous trouverez ici le /: code> méthode. Il est curry et prend un deuxième argument, qui est (ici) une fonction anonyme de type (chaîne, char) => chaîne code>. Voir aussi Stackoverflow.com/q/7339618/770361 , Stackoverflow.com/questions/2293592/...
Toutes les réponses ci-dessus sont correctes et voici ma prise:
def rev(s: String): String = {
val str = s.toList
def f(s: List[Char], acc: List[Char]): List[Char] = s match {
case Nil => acc
case x :: xs => f(xs, x :: acc)
}
f(str, Nil).mkString
}
Bienvenue sur Stackoverflow. En plus de la réponse que vous avez fournie, veuillez envisager de fournir une brève explication de la raison et de la manière dont cela fixe la question.