2013-06-05 82 views
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) 

我該怎麼辦呢?

+0

你的問題來自於一個事實,即你的地圖裏面你異種混合類型的值(有些是地圖,其他人沒有),所以你的地圖被解釋爲地圖[詮釋,任何(因爲任何是共同的根在Int和Map的類型層次結構中。)由於Any沒有「get」方法或「apply」方法,它們都會以錯誤結束。 –

回答

5

你有lost type information

其實你可以做你想做的,但它不是類型安全的。

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

+0

最後一個可以使用adhoc類 –

+0

我想要List的第二個元素,我該怎麼做? –

+0

@ om-nom-nom:類型參數不是這裏最大的問題。在同一個容器中存儲'Int'和'Map'的想法是邪惡的。 – senia

1

你有其中有不一致的類型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) 
    } 
} 

東西這類的。