2013-04-30 80 views
0

考慮以下爲了理解地圖查找 - 有沒有更好的方法?

val myMap: Map[String, List[Int]] = Map("a" -> List(1,2,3), 
             "b" -> List(4,5,6), 
             "d" -> List(7)) 

val possibleKeys: List[String] = List("c","a", "b", "e") 

我想遍歷可能的密鑰,如果地圖包含一個橫貫地圖的價值觀

我想出的選項有:

隨着一個過濾器

for { 
    key <- possibleKeys 
    if (myMap contains key) 
    int <- myMap(key) 
    r <- 0 to int 
    } yield (r, int)  

隨着getOrElse

for { 
    key <- possibleKeys 
    int <- myMap.getOrElse(key, Nil) 
    r <- 0 to int 
    } yield (r, int) 

(兩者返回相同的結果:)

List((0,1), (1,1), (0,2), (1,2), (2,2), (0,3), (1,3), (2,3), (3,3), (0,4), (1,4), (2,4), (3,4), (4,4), (0,5), (1,5), (2,5), (3,5), (4,5), (5,5), (0,6), (1,6), (2,6), (3,6), (4,6), (5,6), (6,6)) 

因爲我知道Scala的支持爲內涵的選項,我當時有點驚訝,這沒有奏效

for { 
    key <- possibleKeys 
    int <- myMap.get(key) 
    r <- 0 to int //<-- compilation error 
    } yield (r, int) 

抱怨type mismatch; found : List[Int] required: Int

我隱約明白爲什麼,但有沒有一種方法可以使這項工作沒有if子句或getOrElse方法? (例如,有沒有辦法讓myMap.get(key)版本正常工作?)

+0

使用的方法keySetapply出於好奇,你的代碼似乎並不符合您的描述。除此之外,還有什麼是'r < - 0到int'呢?從你的口頭描述中,我假設你想省略這一步,只是產生'(key,int)'所以我想知道'r'在做什麼:) – 2013-04-30 13:38:17

+0

@MyseriousDan只是爲了說明我打算使用結果作爲其他迭代的輸入,口頭描述不完整,將修復描述,謝謝 – 2013-04-30 14:00:06

回答

4

您試圖在您的理解中混用不兼容的類型。您可以通過將示例轉換爲Seq來修復它。

for { 
    key <- possibleKeys 
    ints <- myMap.get(key).toSeq 
    int <- ints 
    r <- 0 to int 
} yield (r, int) 

有問題的在這裏這個非常類似的問題一個相當不錯的解釋:Type Mismatch on Scala For Comprehension

0

您可以在Map

for { 
    key <- possibleKeys 
    if myMap.keySet(key) 
    int <- myMap(key) 
    r <- 0 to int 
} yield (r, int) 

res5: List[(Int, Int)] = List((0,1), (1,1), (0,2), (1,2), (2,2), (0,3), (1,3), (2,3), (3,3), (0,4), (1,4), (2,4), (3,4), (4,4), (0,5), (1,5), (2,5), (3,5), (4,5), (5,5), (0,6), (1,6), (2,6), (3,6), (4,6), (5,6), (6,6)) 
相關問題