我有一个地图访问嵌套地图的价值观
val m = Map(1->13, 2->Map(3->444, 4-> List("aaa", "bbb")))
我想它的嵌套值:
// these all lead to an error
m.get(2)(3)
m.get(2).get(3)
m.get(2).get.get(3)
我该怎么办呢?
我有一个地图访问嵌套地图的价值观
val m = Map(1->13, 2->Map(3->444, 4-> List("aaa", "bbb")))
我想它的嵌套值:
// these all lead to an error
m.get(2)(3)
m.get(2).get(3)
m.get(2).get.get(3)
我该怎么办呢?
其实你可以做你想做的,但它不是类型安全的。
m.get(2).flatMap{ case m2: Map[Int, _] => m2.get(3) }
既然你已经失去了类型信息,你必须明确地投,所以,如果你想获得名单的元素,你应该做这样的事情:
m.get(2).flatMap{ case m2: Map[Int, _] => m2.get(4) }.map{ case l: List[_] => l(1) }
你应该尽量保存类型信息。至少你可以使用Either
。
最后一个可以使用adhoc类 –
我想要List的第二个元素,我该怎么做? –
@ om-nom-nom:类型参数不是这里最大的问题。在同一个容器中存储'Int'和'Map'的想法是邪恶的。 – senia
你有其中有不一致的类型key-value
双一个map
。因此不可能有一个普遍的答案。
首先m.get(2)
返回Option[Any]
。这样做m.get(2)(3)
基本上是试图做:
val option = m.get(2) //option is of type Option[Any]
option(3) //error
因此,你需要做的:
m.get(2) match {
case Some(i) => i match {
case j:Map[Any,Any] => j(3)
}
}
东西这类的。
你的问题来自于一个事实,即你的地图里面你异种混合类型的值(有些是地图,其他人没有),所以你的地图被解释为地图[诠释,任何(因为任何是共同的根在Int和Map的类型层次结构中。)由于Any没有“get”方法或“apply”方法,它们都会以错误结束。 –