Scala 为什么地图添加重复项只使用最后一个键';s值
根据这一问题: 我需要使用scalaz来获得我想要的东西,但是我很好奇是否有人知道为什么下面的东西不能像我期望的那样工作Scala 为什么地图添加重复项只使用最后一个键';s值,scala,map,add,Scala,Map,Add,根据这一问题: 我需要使用scalaz来获得我想要的东西,但是我很好奇是否有人知道为什么下面的东西不能像我期望的那样工作 Map(1->2.0)+(1->1.0) //Map(1->1.0) 我希望这将导致Map(1->3.0)。但是,“地图”似乎只返回最后一个键,如下所示: Map(1->1.0, 1->3.0) //Map(1->3.0) 那么根据 将两个或多个元素添加到此集合并返回新集合 在上面,我猜地图可能会存储值,但只返回最后一
Map(1->2.0)+(1->1.0) //Map(1->1.0)
我希望这将导致Map(1->3.0)
。但是,“地图”似乎只返回最后一个键,如下所示:
Map(1->1.0, 1->3.0) //Map(1->3.0)
那么根据
将两个或多个元素添加到此集合并返回新集合
在上面,我猜地图可能会存储值,但只返回最后一项?这并不是我对add应该做什么的直觉……也许这是一个提高效率的举措
一旦我有更多的时间,我会看一看代码并试图从中找出答案,但我想在这里问一下,以防有人已经知道?这与效率无关;它在打字
Map
plus元素返回兼容类型的映射。您不知道类型,因此无法知道如何添加数字。您可以列出它们,但是Seq(2.0,1.0)
不是2.0
的超类型。因此,您最终会得到一个到Any
的映射,这对保持类型的正确性毫无帮助,而且您也无法用其他元素替换现有元素
因此,+
如果键不存在,则添加新元素;如果键存在,则替换现有元素。(不过,文件应该这么说。)
如果你想要“其他”行为,你需要一个更复杂的转换,这就是Scalaz对元素的自然添加所做的。@RexKerr的答案是完全正确的,但我认为没有强调这里的关键误解 对
映射的+
操作意味着put
——它将一个新的键/值对放入映射中(可能会替换该键的现有对)。它与加法没有任何关系(Rex的回答进一步解释了它不一定与加法有任何关系)。你似乎来自C#背景,因此你应该考虑:
myMap + (1, 1.0)
作为存在
myMap[1] = 1.0
插入新的键/值对的能力是映射/字典数据类型的基本操作。您想要编码的功能不是那么基本(这是一种更通用的按键合并地图的功能的特例,正如您提到的问题和中所述)。这是将键值对放入地图数据结构的完全正常的操作。