Scala-从字符串创建地图

时间:2017-10-27 06:36:57

标签: scala scala-collections

你有一个字符串,字符串的if格式如下所示:

val str = "{a=10, b=20, c=30}"

此字符串中的所有参数都是唯一的,并以逗号和空格分隔。此字符串始终以' {'并以'}结束。我想用这个字符串创建一个Map,如下所示:

val values = Map("a" -> 10, "b" -> 20, "c" -> 30)

我能实现这一目标的最有效方法是什么?

4 个答案:

答案 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
}

使用dropdropRight删除括号。然后使用表达式,拆分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