代码之家  ›  专栏  ›  技术社区  ›  Metadata

如何将可变映射的值更新为主映射键的值?

  •  0
  • Metadata  · 技术社区  · 6 年前

    我在Scala中有一个可变映射,定义如下:

    scala> var sm = mutable.Map[String, mutable.Map[Int, Int]]()
    sm: scala.collection.mutable.Map[String,scala.collection.mutable.Map[Int,Int]] = Map()
    

    我有一个映射,其中有另一个映射作为其值,并将值插入其中,如下所示。

    scala> sm += ("abc" -> mutable.Map(1->0,0->0))
    res77: scala.collection.mutable.Map[String,scala.collection.mutable.Map[Int,Int]] = Map(abc -> Map(1 -> 0, 0 -> 0))
    
    scala> sm
    res78: scala.collection.mutable.Map[String,scala.collection.mutable.Map[Int,Int]] = Map(abc -> Map(1 -> 0, 0 -> 0))
    

    我的“abc”来自另一个值为0或1的文件,我需要验证它并获取0&1的计数并在地图中更新它 sm . 在验证之前,我试图更新scala REPL上的值,如下所示

    scala> sm += ("abc" -> (1 -> sm("abc")(1)+1))
    <console>:27: error: type mismatch;
     found   : Int(1)
     required: String
           sm += ("abc" -> (1 -> sm("abc")(1)+1))
    

    所以我试着先打开 "abc"->1 使用 sm("abc")(1) 0 并增加了它的价值,也工作得很好。

    scala> sm("abc")(1)+2
    res90: Int = 2
    

    但是当我用同一个表达式 sm(“abc”)(1) 在地图上 山猫 更新的值 sm(“abc”)(1)

    scala> sm += ("abc" -> (1 -> sm("abc")(1)+2))
    <console>:27: error: type mismatch;
     found   : Int(2)
     required: String
           sm += ("abc" -> (1 -> sm("abc")(1)+2))
    scala> var e = sm("abc")(1)+2
    e: Int = 2
    
    scala> sm += ("abc" -> (1 -> e ))
    <console>:29: error: type mismatch;
     found   : (Int, Int)
     required: scala.collection.mutable.Map[Int,Int]
           sm += ("abc" -> (1 -> e ))
    

    这行得通 sm += ("abc" -> mutable.Map(1 -> e )) 但它替换了密钥0并导致

    scala> sm += ("abc" -> mutable.Map(1 -> e ))
    res93: scala.collection.mutable.Map[String,scala.collection.mutable.Map[Int,Int]] = Map(abc -> Map(1 -> 2))
    

    我无法理解此错误消息。有谁能告诉我我在这里犯了什么错误,我如何更新地图的->地图值,并将输出作为

    Map(abc -> Map(1 -> 2, 0 -> 0))
    
    0 回复  |  直到 6 年前
        1
  •  0
  •   SwiftMango    6 年前

    您的代码有一些问题:

    1. -> 优先级高于 + 所以你的代码本质上是:

      (1 -> sm("abc")(1)) + 2
      

      要使其工作,请在加号周围加上括号:

      1 -> (sm("abc")(1) + 2)
      

      它会给你同样的错误 (Int, Int) .

    2. 元组没有隐式转换( -> 创建要映射的元组),因此需要使用显式构造函数。

    最后,您的版本的工作代码是:

    sm += ("abc" -> mutable.Map(1 -> (sm("abc")(1) + 2) ) )
    

    然而,这不是一个好的做法。您已经将该值定义为可变映射,因此不需要每次更新该值时都构造新映射。加上你的版本也失去了这对 0 -> 0 . 你可以这样做:

    sm("abc")(1) = sm("abc")(1) + 2
    

    sm 那么 Map(abc -> Map(1 -> 2, 0 -> 0))

    推荐文章