【问题标题】:Converting command line argument key=value pair to Map in scala在scala中将命令行参数key = value对转换为Map
【发布时间】:2016-10-21 06:33:55
【问题描述】:

在我的主程序中,我收到如下输入 - 键1=值1 键2=值2

现在我想要用它创建一张地图。我知道这样做的必要方式,我会得到 Array[String] ,它可以是 foreach 然后用“=”分割,然后键和值可以用来形成一个 Map。

有没有一种功能强大且可读性好的方法来实现这一点? 另外,如果我可以避免可变 Map 并且我想避免初始 Dummy 值初始化,那就太好了。

  def initialize(strings: Array[String]): Unit = {
    val m = collection.mutable.Map("dummy" -> "dummyval")
    strings.foreach(
      s => {
        val keyVal:Array[String] = s.split("=")

        m += keyVal(0) -> keyVal(1)

      })
    println(m)
  }

【问题讨论】:

    标签: scala scala-collections


    【解决方案1】:

    你可以使用toMap()

    但是,从数组转换为元组并非易事: How to convert an Array to a Tuple?

    scala> val ar = Array("key1=value1","key2=value2")
    ar: Array[String] = Array(key1=value1, key2=value2)
    
    scala> ar.collect(_.split("=") match { case Array(x,y) => (x,y)}).toMap
    res10: scala.collection.immutable.Map[String,String] = Map(key1 -> value1, key2 -> value2)
    

    也许您必须致电 Function.unlift 获取 intellij

    val r = ar.collect(Function.unlift(_.split("=") match { case Array(x, y) => Some(x, y)})).toMap
    

    【讨论】:

    • intellij 中出现“无法解析对此类签名的引用收集”的错误。
    • 更精确的错误 - 类型不匹配,预期 PartialFunction[String, NotInferedB],实际 (Any) => (T,T)
    • 是的.. 非常感谢。我想知道 intellij 是否可以解决这个问题。
    【解决方案2】:

    与上面类似,但只使用“地图”

    ar.map(_.split("=")).map(a=>(a(0), a(1))).toMap
    

    【讨论】:

    • 然后是你的 IDE,尝试使用 File->Invalidates caches 并重新启动。您始终可以在 scala repl 中验证单行解决方案,以确保您的 IDE 没有惹恼您 :)
    【解决方案3】:

    您可以使用Scopt 简洁地进行命令行参数解析。

    【讨论】:

    • 你并不总是可以根据自己的方便使用任何开源 :)
    • 这是我朋友的建议。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2019-08-08
    • 2015-03-22
    • 2016-07-14
    • 2021-03-17
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多