【问题标题】:Scala- creating a map from stringScala-从字符串创建地图
【发布时间】:2017-10-27 17:32:03
【问题描述】:

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

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

此字符串中的所有参数都是唯一的,并以逗号和空格分隔。此外,此字符串始终以“{”开头并以“}”结尾。我想用这个字符串创建一个地图,如下所示:

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

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

【问题讨论】:

    标签: scala scala-collections


    【解决方案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】:

      使用regex可以简单的实现这个:

        "(\\w+)=(\\w+)".r.findAllIn("{a=10, b=20, c=30}").matchData.map(i => {
          (i.group(1), i.group(2))
        }).toMap
      

      【讨论】:

        【解决方案3】:

        你要写的函数很简单:

        def convert(str : String) : Map[String, String] = {
            str.drop(1).dropRight(1).split(", ").map(_.split("=")).map(arr => arr(0)->arr(1)).toMap
        }
        

        使用dropdropRight,您可以删除括号。然后使用表达式, 拆分字符串,这会产生多个字符串。

        比你拆分每个字符串,这会产生包含两个元素的数组。这些用于创建地图。

        【讨论】:

          【解决方案4】:

          我会这样做(我认为这里不需要正则表达式):

          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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-08-09
            • 1970-01-01
            • 2011-11-25
            • 2013-11-25
            • 1970-01-01
            • 1970-01-01
            • 2017-12-12
            相关资源
            最近更新 更多