Scala - map函数 - 仅返回Map的最后一个元素

时间:2016-11-05 17:55:58

标签: scala dictionary duplicates key key-value

我是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的最后一个成员。有人可以解释为什么会这样吗?

提前致谢!

1 个答案:

答案 0 :(得分:9)

在Scala中,Map不能有重复的密钥。当您向key -> value添加新的Map对时,如果该密钥已存在,则会覆盖之前的值。如果您要从集合上的功能操作创建映射,那么您最终将得到与每个唯一键的 last 实例对应的值。在您编写的示例中,原始地图map1的每个字符串键具有相同的长度,因此所有字符串键都为3生成相同的整数键result1。在计算result1的情况下发生的事情是:

  1. 创建一个新的空地图
  2. 您将"abc" -> 1映射到3 -> 3并将其添加到地图中。结果现在包含1 -> 3
  3. 您将"efg" -> 2映射到3 -> 2并将其添加到地图中。由于密钥相同,因此您将覆盖key = 3的现有值。结果现在包含2 -> 3
  4. 您将"hij" -> 3映射到3 -> 3并将其添加到地图中。由于密钥相同,因此您将覆盖key = 3的现有值。结果现在包含3 -> 3
  5. 返回结果,即Map(3 -> 3)`。
  6. 注意:我做了一个简化的假设,即map迭代器中元素的顺序与您在声明中编写的顺序相同。订单由散列箱确定,可能与您添加元素的顺序不匹配,因此不要构建依赖于此假设的任何内容。