我有一個地圖訪問嵌套地圖的價值觀
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」方法,它們都會以錯誤結束。 –