前几天我想知道为什么 scala.collection.Map 将其 unzip 方法定义为
def unzip [A1, A2] (implicit asPair: ((A, B)) ⇒ (A1, A2)): (Iterable[A1], Iterable[A2])
由于该方法“仅”返回一对 Iterable 而不是一对 Seq,因此不能保证原始映射中的键/值对出现在返回序列中的匹配索引处,因为 Iterable 不保证遍历的顺序。所以如果我有一个
Map((1,A), (2,B))
,然后在调用之后
Map((1,A), (2,B)) unzip
我可能最终得到
... = (List(1, 2),List(A, B))
和
... = (List(2, 1),List(B, A))
虽然我可以想象这背后与存储相关的原因(例如,想想 HashMaps),但我想知道你们对这种行为的看法。Map.unzip 方法的用户可能会认为这些项目是以相同的配对顺序返回的(我敢打赌,这可能几乎总是如此),但因为不能保证这反过来会产生难以发现的错误图书馆用户的代码。
也许应该在随附的 scaladoc 中更明确地表达这种行为?
编辑:请注意,我并不是将地图称为有序集合。我只对解压缩后的“匹配”序列感兴趣,即
val (keys, values) = someMap.unzip
它适用于所有 i (keys(i), values(i)) 是原始映射的一个元素。