2015-09-25 175 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),最終覆蓋了以前的映射。