【发布时间】:2017-10-27 17:32:03
【问题描述】:
你好有一个字符串,字符串的if格式如下:
val str = "{a=10, b=20, c=30}"
此字符串中的所有参数都是唯一的,并以逗号和空格分隔。此外,此字符串始终以“{”开头并以“}”结尾。我想用这个字符串创建一个地图,如下所示:
val values = Map("a" -> 10, "b" -> 20, "c" -> 30)
实现这一目标的最有效方法是什么?
【问题讨论】:
你好有一个字符串,字符串的if格式如下:
val str = "{a=10, b=20, c=30}"
此字符串中的所有参数都是唯一的,并以逗号和空格分隔。此外,此字符串始终以“{”开头并以“}”结尾。我想用这个字符串创建一个地图,如下所示:
val values = Map("a" -> 10, "b" -> 20, "c" -> 30)
实现这一目标的最有效方法是什么?
【问题讨论】:
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)
【讨论】:
使用regex可以简单的实现这个:
"(\\w+)=(\\w+)".r.findAllIn("{a=10, b=20, c=30}").matchData.map(i => {
(i.group(1), i.group(2))
}).toMap
【讨论】:
你要写的函数很简单:
def convert(str : String) : Map[String, String] = {
str.drop(1).dropRight(1).split(", ").map(_.split("=")).map(arr => arr(0)->arr(1)).toMap
}
使用drop 和dropRight,您可以删除括号。然后使用表达式, 拆分字符串,这会产生多个字符串。
比你拆分每个字符串,这会产生包含两个元素的数组。这些用于创建地图。
【讨论】:
我会这样做(我认为这里不需要正则表达式):
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
【讨论】: