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)
版本正常工作?)
使用的方法
keySet
和apply
出于好奇,你的代码似乎并不符合您的描述。除此之外,还有什么是'r < - 0到int'呢?从你的口头描述中,我假设你想省略这一步,只是产生'(key,int)'所以我想知道'r'在做什么:) – 2013-04-30 13:38:17@MyseriousDan只是为了说明我打算使用结果作为其他迭代的输入,口头描述不完整,将修复描述,谢谢 – 2013-04-30 14:00:06