在 Scala 中获取一个嵌套哈希映射下 3 级的值

Getting a value 3 levels down a nested hashmap in scala

我有以下嵌套的 Hashmap -

  val  P = HashMap("a"->HashMap("aa"->HashMap("aaa"-> 0.25,"aab"-> 0.95),
                                "ab"->HashMap("aba"-> 0.2, "abb"-> 0.8)),
                   "b"->HashMap("ba"->HashMap("baa"-> -0.3,"bab"-> -0.4,"bac"-> -0.2),
                                "bb"->HashMap("bba"-> 0.3, "bbb" -> 0.4, "bbc"-> 0.4)),
                   "c"->HashMap("ca"->HashMap("caa"-> 0.2,"cab" -> 0.001),
                                "cb" -> HashMap()))

如何到达 val m = P("a")("ab")("aba")? 它抛出以下错误 -

Compilation Failed
Main.scala:59: type mismatch;
 found   : String("aba")
 required: _12 where type _12 <: String
P("a")("ab")("aba") 
             ^

val m = P("a")("ab") 然而有效,给出 Map("aba" -> 0.2, "abb" -> 0.8)。如何获取 "aba" 键值?

问题实际上是P的类型推断,因为其中一个HashMap没有显式类型。将 P 替换为 :

val  P = HashMap("a"->HashMap("aa"->HashMap("aaa"-> 0.25,"aab"-> 0.95),
                              "ab"->HashMap("aba"-> 0.2, "abb"-> 0.8)),
                 "b"->HashMap("ba"->HashMap("baa"-> -0.3,"bab"-> -0.4,"bac"-> -0.2),
                              "bb"->HashMap("bba"-> 0.3, "bbb" -> 0.4, "bbc"-> 0.4)),
                 "c"->HashMap("ca"->HashMap("caa"-> 0.2,"cab" -> 0.001),
                              "cb" -> HashMap[String, Double]()))

你可以正确地注释类型,如果你真的静态初始化类似的东西,我也会推荐另一种代码格式:

val someValue: String = "key" 
val someOtherValue: Double = 0.1 

val P: Map[String, Map[String, Map[String, Double]]] =
  HashMap("a" -> HashMap(
    "aa" -> HashMap(
      "aaa" -> 0.25,
      "aab" -> 1 // implicitly converted to Double
    ),
    "ab" -> HashMap(
      "aba" -> 0.2,
      "abb" -> 0.8)
    ),
    "b" -> HashMap(
      "ba" -> HashMap(
        "baa" -> -0.3,
        "bab" -> -0.4,
        "bac" -> -0.2
      ),
      "bb" -> HashMap(
        // would not compile, though it would compile in the original example
        // messing up the result type completely and good luck finding this
        // with the original formatting
        /* someOtherValue -> someValue, */
        "bba" -> 0.3,
        "bbb" -> 0.4,
        "bbc" -> 0.4
      )
    ),
    "c" -> HashMap(
      "ca" -> HashMap(
        "caa" -> 0.2,
        "cab" -> 0.001
      ),
      "cb" -> HashMap() // Map[String, Double] inferred
    )
  )


val m = P("a")("aa")("aab") // -> 1.0
val m2 = P("a")("ab")("aba") // -> 0.2