首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >新手: Scala地图

新手: Scala地图
EN

Stack Overflow用户
提问于 2015-09-25 20:26:22
回答 2查看 53关注 0票数 0

我想知道为什么下面的foobar值都是3而不是1,2,3,难道不应该把a映射到1等等吗?

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2015-09-25 20:34:01

不,你问题中的代码就像一个嵌套循环。就好像是你做的一样:

代码语言:javascript
复制
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来实现您想要的功能:

代码语言:javascript
复制
val foobars = (bar zip foo).toMap
票数 8
EN

Stack Overflow用户

发布于 2015-09-25 20:35:10

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

代码语言:javascript
复制
foo.zip(bar).toMap

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

代码语言:javascript
复制
for(f <- foo; b <- bar) yield (f, b)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32782189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档