新手:斯卡拉地图

时间:2015-09-25 12:26:22

标签: scala

我想了解为什么下面的foobars值都是3而不是1,2,3。是不是应该将a映射到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)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

如果要将相应的元素配对,可以使用zip

foo.zip(bar).toMap

这不起作用的原因是您的for理解会生成foobar中元素的笛卡尔积,您可以看到

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

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