将值从Map映射到Scala中的String

时间:2017-02-21 08:16:16

标签: scala data-structures

我有这样的地图:

val map: Map[String, Int] = Map("Lit1" -> 8, "Lit2" -> 11, "Lit3" -> 7)

和这样的公式:

val r: String = "(Lit1 & (Lit2 | Lit3) & ~Lit2)"

我如何使用map映射Lit1Lit2Lit3的值,以便我将r字符串作为

val r: String = "(8 & (11 | 7) & ~11)"

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

我认为这就是你想要的。

val map: Map[String, Int] = Map("Lit1" -> 8, "Lit2" -> 11, "Lit3" -> 7)
val r: String = "(Lit1 & (Lit2 | Lit3) & ~Lit2)"

map.foldLeft(r){case (s, (k,v)) => s.replaceAll(k,v.toString)}
// res0: String = (8 & (11 | 7) & ~11)

折叠Map key->值对,修改每一步的String

答案 1 :(得分:2)

您可以使用正则表达式来查找和替换您从地图中检索的值的文字:

val map: Map[String, Int] = Map("Lit1" -> 8, "Lit2" -> 11, "Lit3" -> 7)
val r: String = "(Lit1 & (Lit2 | Lit3) & ~Lit2)"
val s: String = """Lit\d+""".r.replaceAllIn(r, m => map(m.group(0)).toString)


println(s) // (8 & (11 | 7) & ~11)

如果查找地图中不存在一个或多个文字,则需要使用getOrElse

val map: Map[String, Int] = Map("Lit1" -> 8, "Lit2" -> 11, "Lit3" -> 7)
val r: String = "(Lit1 & (Lit2 | Lit3) & ~Lit2 & Lit4)"
val s: String = """Lit\d+""".r.replaceAllIn(r, m => map.getOrElse(m.group(0), m.group(0)).toString)


println(s) // (8 & (11 | 7) & ~11 & Lit4)