我有这样的地图:
val map: Map[String, Int] = Map("Lit1" -> 8, "Lit2" -> 11, "Lit3" -> 7)
和这样的公式:
val r: String = "(Lit1 & (Lit2 | Lit3) & ~Lit2)"
我如何使用map
映射Lit1
,Lit2
和Lit3
的值,以便我将r
字符串作为
val r: String = "(8 & (11 | 7) & ~11)"
感谢您的帮助。
答案 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)