它是如何运作的?
(seq#{3 1 22 44})
为什么订单会像
(1 3 44 22)
答案 0 :(得分:13)
因为根据定义,设置数据结构是无序的:http://en.wikipedia.org/wiki/Set_(data_structure)
更确切地说,Clojure的内置集(#{blah blah blah}
给你)是一个哈希集 - 即一个由哈希表(http://en.wikipedia.org/wiki/Hash_tables)支持的集合。它为您提供以下保证:
seq
将为您提供集合中的每个元素,但是以未定义的顺序。这里的未定义顺序意味着迭代顺序取决于您在集合中插入的元素,它们的编号,插入它们的顺序,您之前尝试过的所有其他操作,以及其他各种操作实现细节可能会从语言版本变为另一个(甚至在实现之间 - 您可能会,也可能会在Clojure中获得不同的结果,在64位JVM上运行Clojure或ClojureScript )。
要记住的重要一点是,如果你正在编写适用于集合(或映射)的代码,那么永远不要让它依赖于所述集合/映射中的任何顺序概念。它会破裂。
答案 1 :(得分:12)
#{3 1 22 44}
是Clojure中的set,不是有序序列。
因此,当您在集合上执行seq
时,生成的seq的顺序是任意的(但每次在此实例上调用seq时都是相同的。)
如果要对集进行排序,可以使用sorted-set