2015-09-25 178 views
0

我想了解为什么foobars下面的值都是3而不是1,2,3。它不是应该映射到1等?新手:斯卡拉地图

val foo = Array(1,2,3) 
val bar = Array("a","b","c") 

import scala.collection.mutable.Map 
var foobars = Map[String, Int]() 
for (f <- foo; b <- bar) foobars += (b -> f) 

println(foobars) 
// Map(b -> 3, a -> 3, c -> 3) 

回答

8

不,您的问题中的代码就像一个嵌套循环。这是因为如果你这样做:

for (f <- foo) { 
    for (b <- bar) { 
    foobars += (b -> f) 
    } 
} 

会发生什么:在外部循环的第一次迭代,你的foo的第一个值分配给bar每个键。所以你会得到:Map('a' -> 1, 'b' -> 1, 'c' -> 1)。然后,在外循环的第二次迭代中,覆盖条目,结果为:Map('a' -> 2, 'b' -> 2, 'c' -> 2)。在第三次迭代中,您再次覆盖条目,因此最终结果为:Map('a' -> 3, 'b' -> 3, 'c' -> 3)

您可以使用zip达到你想要的东西:

val foobars = (bar zip foo).toMap 
+0

你的意思是val foobars =(bar zip foo).toMap –

+0

@DirkNachbar是的,修正了... – Jesper

1

您可以使用zip如果要对相应的元素:

foo.zip(bar).toMap 

这不工作的原因是你的for理解生成foobar中元素的笛卡尔乘积,您可以使用

for(f <- foo; b <- bar) yield (f, b) 

最后三个元素是(3,a), (3,b), (3,c),最终覆盖了以前的映射。