我是Scala的新手,并在地图上尝试了地图功能。 这是我的地图:
scala> val map1 = Map ("abc" -> 1, "efg" -> 2, "hij" -> 3)
map1: scala.collection.immutable.Map[String,Int] =
Map(abc -> 1, efg -> 2, hij -> 3)
这是一个地图功能和结果:
scala> val result1 = map1.map(kv => (kv._1.toUpperCase, kv._2))
result1: scala.collection.immutable.Map[String,Int] =
Map(ABC -> 1, EFG -> 2, HIJ -> 3)
这是另一个地图功能和结果:
scala> val result1 = map1.map(kv => (kv._1.length, kv._2))
result1: scala.collection.immutable.Map[Int,Int] = Map(3 -> 3)
第一个map函数按预期返回所有成员,但第二个map函数仅返回Map的最后一个成员。有人可以解释为什么会这样吗?
提前致谢!
答案 0 :(得分:9)
在Scala中,Map
不能有重复的密钥。当您向key -> value
添加新的Map
对时,如果该密钥已存在,则会覆盖之前的值。如果您要从集合上的功能操作创建映射,那么您最终将得到与每个唯一键的 last 实例对应的值。在您编写的示例中,原始地图map1
的每个字符串键具有相同的长度,因此所有字符串键都为3
生成相同的整数键result1
。在计算result1
的情况下发生的事情是:
"abc" -> 1
映射到3 -> 3
并将其添加到地图中。结果现在包含1 -> 3
。"efg" -> 2
映射到3 -> 2
并将其添加到地图中。由于密钥相同,因此您将覆盖key = 3
的现有值。结果现在包含2 -> 3
。 "hij" -> 3
映射到3 -> 3
并将其添加到地图中。由于密钥相同,因此您将覆盖key = 3
的现有值。结果现在包含3 -> 3
。 Map(3 -> 3
)`。注意:我做了一个简化的假设,即map迭代器中元素的顺序与您在声明中编写的顺序相同。订单由散列箱确定,可能与您添加元素的顺序不匹配,因此不要构建依赖于此假设的任何内容。