为什么clojure conj在矢量和地图之间有所不同

时间:2016-10-16 05:31:50

标签: vector clojure

> (conj [0] 1 2 3)
[0 1 2 3]
> (conj {:a "ei"} {:b "bi"})
{:b "bi", :a "ei"}
>  

看,当它作用于矢量时,它将1,2,3放在它的末尾。 而它放在:b“bi”前面:地图k-v对 为什么是这样? 感谢

2 个答案:

答案 0 :(得分:2)

与许多散列映射实现一样,Clojure's hashed maps不对其条目进行排序,也不保留它们的插入顺序。这样可以获得更好的性能。

请注意,conj也没有通用排序语义(它具有某些具体类型的排序语义,例如向量)。

答案 1 :(得分:0)

您不必像地图那样从conj获取不一致的行为:

(conj [1] 2) ; [1 2]    
(conj (list 1) 2) ; (2 1)

哈希地图没有定义的顺序。但是,对于任何地图,

  • 条目的seq将始终相同
  • valskeys将按照一致的顺序排列。

因此,对于地图m

(= (keys m) (map key m))
(= (vals m) (map val m))
(= m (zipmap (keys m) (vals m)))

目前,此序列似乎与插入顺序无关。我通过随机抽取随机整数来测试这个集合。