为什么(seq#{3 1 22 44})在clojure中出现(1 3 44 22)?

pro*_*ocr 5 clojure set

它是如何工作的?

(seq#{3 1 22 44})

为什么订单会像

(1 3 44 22)

Max*_*oel 13

因为根据定义,集合数据结构是无序的:http://en.wikipedia.org/wiki/Set_(data_structure)

更确切地说,Clojure的内置集(#{blah blah blah}给你)是一个哈希集 - 也就是一个由哈希表(http://en.wikipedia.org/wiki/Hash_tables)支持的集合.它为您提供以下保证:

  • 每个元素的唯一性(不允许重复).
  • O(1)插入和遏制检查的性能特征.
  • 迭代工作 - 调用seq将为您提供集合中的每个元素,但是以未定义的顺序.

未定义的顺序,在这里,意味着迭代顺序取决于你在设置插入的元素,它们的数量,在其中插入的顺序,所有其它的操作,你可能已经在该集合受审,以及其他各种实施细则是可能会从语言版本变为另一个(甚至在实现之间 - 您可能会,也可能会在Clojure中获得不同的结果,在64位JVM上运行Clojure或ClojureScript).

要带走的重要一点是,如果你正在编写适用于集合(或映射)的代码,那么永远不要让它依赖于所述集合/映射中的任何顺序概念.它会破碎.


alb*_*hin 12

#{3 1 22 44}是Clojure中的一个集合,它不是有序序列.

因此,当您seq对集合执行时,生成的seq的顺序是任意的(但每次在此实例上调用seq时都是相同的).

如果要对集进行排序,可以使用创建排序集 sorted-set