在 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
我有以下嵌套的 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