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

cha*_*rlx 4 dictionary scala key duplicates 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)
Run Code Online (Sandbox Code Playgroud)

这是一个map函数和结果:

    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)
Run Code Online (Sandbox Code Playgroud)

这是另一个map函数和结果:

    scala> val result1 = map1.map(kv => (kv._1.length, kv._2))
    result1: scala.collection.immutable.Map[Int,Int] = Map(3 -> 3)
Run Code Online (Sandbox Code Playgroud)

第一个map函数按预期返回所有成员,但第二个map函数仅返回Map的最后一个成员.有人可以解释为什么会这样吗?

提前致谢!

Tim*_*Tim 9

在Scala中,a Map不能有重复的键.key -> value向a 添加新对时Map,如果该键已存在,则覆盖以前的值.如果您要从集合上的功能操作创建映射,那么您将最终得到与每个唯一键的最后一个实例对应的值.在你写的例子,原来地图的每个字符串键map1具有相同的长度,所以你的所有字符串键生成相同的整数关键3result1.在引擎盖下计算的result1是:

  1. 将创建一个新的空地图
  2. 您映射"abc" -> 13 -> 3,并将其添加到地图中.结果现在包含1 -> 3.
  3. 您映射"efg" -> 23 -> 2,并将其添加到地图中.由于密钥相同,因此您将覆盖现有值key = 3.结果现在包含2 -> 3.
  4. 您映射"hij" -> 33 -> 3,并将其添加到地图中.由于密钥相同,因此您将覆盖现有值key = 3.结果现在包含3 -> 3.
  5. 返回结果,这是Map(3 -> 3``.

注意:我做了一个简化的假设,即map迭代器中元素的顺序与您在声明中编写的顺序相同.订单由散列bin确定,可能与您添加元素的顺序不匹配,因此不要构建依赖于此假设的任何内容.