【发布时间】:2015-11-02 23:48:01
【问题描述】:
每当我在 Clojure 中使用文字符号定义哈希集时,它都会像这样对周围的值进行打乱:
user=> #{1 2 4 6 5}
它返回了这个:
#{1 4 6 2 5}
但是当我把
user=> #{1 4 6 2 5}
它返回:
user=> #{1 4 6 2 5}
这背后的逻辑是什么?
【问题讨论】:
每当我在 Clojure 中使用文字符号定义哈希集时,它都会像这样对周围的值进行打乱:
user=> #{1 2 4 6 5}
它返回了这个:
#{1 4 6 2 5}
但是当我把
user=> #{1 4 6 2 5}
它返回:
user=> #{1 4 6 2 5}
这背后的逻辑是什么?
【问题讨论】:
根据定义,集合是无序的。所以作为接口问题,顺序是任意的。但是,哈希集无疑会将其成员存储在某种哈希表中。因此,枚举散列集成员的自然方法是遍历内部散列表。因此,生成元素的顺序将取决于元素的哈希值,以及这些值如何映射到底层哈希表。
这就是为什么元素的“排序”看起来是随机的,但却是可重复的。
【讨论】:
(conj (sorted-set 1 4 6 5) 2) ;=> #{1 2 4 5 6}
PersistentHashSets 的实现方式。
sorted-set 函数存在是有原因的。