Oto, co próbowałem:
def doStringReplcements(originalStr: String, replacementsMap: Map[String,String]): String = {
var newStr = originalStr
replacementsMap.foreach { pair =>
newStr = newStr.replaceAllLiterally(pair._1, pair._2)
}
newStr
}
Ale funkcjonalny styl programowania zaleca unikanie zmiennych, więc jak to zrobić za pomocą samych zmiennych?
Odpowiedzi:
4 dla odpowiedzi № 1Rozważ użycie foldLeft
funkcja na mapie.
na przykład
replacementsMap.foldLeft(originalStr){ case (accumulator, (target, replacement)) =>
accumulator.replaceAllLiterally(target, replacement)
}
2 dla odpowiedzi nr 2
Zastanów się nad wyrażeniem regularnym:
scala> import util.matching.Regex
import util.matching.Regex
scala> val text = "one in hand, two in bush"
text: String = one in hand, two in bush
scala> val reps = Map("one"->"lots","two"->"more")
reps: scala.collection.immutable.Map[String,String] = Map(one -> lots, two -> more)
scala> val r = reps.keys.mkString("|").r
r: scala.util.matching.Regex = one|two
scala> r.replaceAllIn(text, m=>reps(m.matched))
res0: String = lots in hand, more in bush