什么时候使用`zipmap`和`map vector`?

unp*_*680 23 clojure

我问的是zipmap构造的特殊性只是发现我显然做错了.所以我(map vector v u)在这个过程中学到了很多.但在此案例之前,我曾使用过zipmap来完成(map vector ...)工作.它是否有用,因为结果地图足够小,可以整理出来?

而对于实际问题:有什么用途zipmap,以及如何/何时使用它.什么时候使用(map vector ...)

我原来的问题需要原始订单,所以映射任何东西都不是一个好主意.但基本上 - 除了结果对的顺序 - 这两种方法是等价的,因为seq'd map变成了一系列向量.

(for [pair (map vector v (rest v))]
  ( ... )) ;do with (first pair) and (last pair)

(for [pair (zipmap v (rest v))]
 ( ... )) ;do with (first pair) and (last pair)
Run Code Online (Sandbox Code Playgroud)

mik*_*era 37

当您想要从单独的键和值序列直接构造散列映射时,请使用(zipmap ...).输出是一个hashmap:

(zipmap [:k1 :k2 :k3] [10 20 40])
=> {:k3 40, :k2 20, :k1 10}
Run Code Online (Sandbox Code Playgroud)

在尝试合并多个序列时使用(映射矢量...).输出是一个懒惰的向量序列:

(map vector [1 2 3] [4 5 6] [7 8 9])
=> ([1 4 7] [2 5 8] [3 6 9])
Run Code Online (Sandbox Code Playgroud)

需要考虑的其他注意事项:

  • Zipmap仅适用于两个输入序列(键+值),而映射矢量可以处理任意数量的输入序列.如果您的输入序列不是键值对,那么您可能应该使用地图矢量而不是zipmap
  • zipmap比做地图矢量更高效,更简单,然后从键/值对创建一个哈希图 - 例如,这(into {} (map vector [:k1 :k2 :k3] [10 20 40]))是一个非常复杂的方法来做zipmap
  • map vector是懒惰的 - 所以它带来了一些额外的开销,但在你真正需要懒惰的情况下非常有用(例如在处理无限序列时)
  • 你可以做(​​seq(zipmap ....))来获得一系列键值对,而不是(map vector ...),但要注意这可能会重新排序键值对的序列(因为中间hashmap是无序的)

  • 我一直使用的`zipmap`的另一个用途是用地图矢量创建一个地图.考虑``(zipmap(map:id data)data)`其中data是地图的矢量,每个都包含一个唯一的`:id`键/值对. (2认同)

Mau*_*ijk 7

这些方法或多或少是等价的.当您使用zipmap时,您将获得一个包含键/值对的地图.当您遍历此地图时,您将获得[键值]向量.但是没有定义地图的顺序.使用第一种方法中的"map"构造,可以创建一个包含两个元素的向量列表.订单已定义.

在您的示例中,Zipmap可能效率稍低.我会坚持使用'地图'.

编辑:哦,而且zipmap不是懒惰的.所以在你的例子中不使用它的另一个原因.

编辑2:当您真正需要地图时使用zipmap,例如快速随机基于密钥的访问.