【问题标题】:Scala - map function - Only returned last element of a MapScala - 地图函数 - 只返回地图的最后一个元素
【发布时间】:2017-03-19 09:28:21
【问题描述】:

我是 Scala 的新手,并在 Map 上尝试了 map 函数。 这是我的地图:

    scala> val map1 = Map ("abc" -> 1, "efg" -> 2, "hij" -> 3)
    map1: scala.collection.immutable.Map[String,Int] = 
          Map(abc -> 1, efg -> 2, hij -> 3)

这是一个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)

这是另一个地图函数和结果:

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

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

提前致谢!

【问题讨论】:

    标签: scala dictionary duplicates key key-value


    【解决方案1】:

    在 Scala 中,Map 不能有重复的键。当您将新的 key -> value 对添加到 Map 时,如果该键已存在,则覆盖之前的值。如果您从集合上的功能操作创建映射,那么您最终将得到与每个唯一键的 last 实例对应的值。在您编写的示例中,原始映射map1 的每个字符串键具有相同的长度,因此您的所有字符串键为result1 生成相同的整数键3。计算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)`。

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

    【讨论】:

    • 非常感谢蒂姆!
    猜你喜欢
    • 1970-01-01
    • 2014-09-09
    • 2021-03-30
    • 2015-04-29
    • 2020-03-17
    • 1970-01-01
    • 2021-03-11
    • 2019-11-13
    • 2015-09-16
    相关资源
    最近更新 更多