你有一个字符串,字符串的if格式如下所示:
val str = "{a=10, b=20, c=30}"
此字符串中的所有参数都是唯一的,并以逗号和空格分隔。此字符串始终以' {'并以'}结束。我想用这个字符串创建一个Map,如下所示:
val values = Map("a" -> 10, "b" -> 20, "c" -> 30)
我能实现这一目标的最有效方法是什么?
答案 0 :(得分:1)
使用正则表达式可以简单地实现此目的:
"(\\w+)=(\\w+)".r.findAllIn("{a=10, b=20, c=30}").matchData.map(i => {
(i.group(1), i.group(2))
}).toMap
答案 1 :(得分:1)
scala> val str = "{a=10, b=20, c=30}"
str: String = {a=10, b=20, c=30}
scala> val P = """.*(\w+)=(\d+).*""".r
P: scala.util.matching.Regex = .*(\w+)=(\d+).*
scala> str.split(',').map{ case P(k, v) => (k, v.toInt) }.toMap
res2: scala.collection.immutable.Map[String,Int] = Map(a -> 10, b -> 20, c -> 30)
答案 2 :(得分:0)
您想要编写的功能非常简单:
def convert(str : String) : Map[String, String] = {
str.drop(1).dropRight(1).split(", ").map(_.split("=")).map(arr => arr(0)->arr(1)).toMap
}
使用drop
和dropRight
删除括号。然后使用表达式,
拆分String,这会产生多个字符串。
比拆分每个字符串要多,这会导致数组包含两个元素。这些用于创建地图。
答案 3 :(得分:0)
我会这样做(我认为这里不需要正则表达式):
val str = "{a=10, b=20, c=30}"
val values: Map[String, Int] = str.drop(1).dropRight(1) // drop braces
.split(",") // split into key-value pairs
.map { pair =>
val Array(k, v) = pair.split("=") // split key-value pair and parse to Int
(k.trim -> v.toInt)
}.toMap