scala - 如何访问和更新 map map 的可变 map 中的值

标签 scala map scala-2.8 scala-collections

我有一个三级数据结构(缩进和换行以提高可读性):

scala> import scala.collection.mutable.Map
import scala.collection.mutable.Map

scala> val m = Map("normal" -> Map("home" -> Map("wins" -> 0, "scores" -> 0),
                                   "away" -> Map("wins" -> 0, "scores" -> 0)))
m: scala.collection.mutable.Map[java.lang.String,
   scala.collection.mutable.Map[java.lang.String,
   scala.collection.mutable.Map[java.lang.String,Int]]] = 
Map((normal,Map(away -> Map(wins -> 0, scores -> 0),
     home -> Map(wins -> 0, scores -> 0))))

访问最里面的数据(分数)需要大量输入:
import org.scalatest.{Assertions, FunSuite}

class MapExamplesSO extends FunSuite with Assertions {
  test("Update values in a mutable map of map of maps") {
    import scala.collection.mutable.Map
    // The m map is essentially an accumulator
    val m = Map("normal" -> 
                Map("home" -> Map("wins" -> 0, "scores" -> 0),
                    "away" -> Map("wins" -> 0, "scores" -> 0)
                  )
          )
    //
    // Is there a less verbose way to increment the scores ?
    //
    assert(m("normal").apply("home").apply("scores") === 0)

    val s1 = m("normal").apply("home").apply("scores") + 1
    m("normal").apply("home").update("scores", s1)

    assert(m("normal").apply("home").apply("scores") === 1)

    val s2 = m("normal").apply("home").apply("scores") + 2
    m("normal").apply("home").update("scores", s2)

    assert(m("normal").apply("home").apply("scores") === 3)
  }
}

有没有更简洁的方法来修改分数的值?

我是 Scala 新手,因此也欢迎对上述代码的所有其他观察。

最佳答案

您不必使用“应用”,只需使用“()”正常进行即可

m("normal")("home")("scores") = 1

关于scala - 如何访问和更新 map map 的可变 map 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4324562/

相关文章:

scala - 帮助 Drools 与 Scala 集成

scala - list 与类 list 。这个 Scala 错误是什么意思?

scala - 未加载 HikariCP 驱动程序的 3.0.0 - IllegalAccessException : AbstractHikariConfig can not access a member with modifiers "private"

c++ STL map.find() 或 map.operator[] 不能在带有 const 限定符的类成员函数中使用

scala - Play Slick 2.1.0 此 DBMS 仅允许从 INSERT 返回单个 AutoInc 列

c++ - 为什么没有 boost::intrusive::map?

C++ 将索引绑定(bind)到一个数据结构

scala - 更新 IntelliJ IDEA

scala - 验证 Datomic 实体 ID 是否有效

scala - 使用 Scala 2.10 反射的类型参数的运行时解析