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

时间:2014-03-03 14:51:10

标签: clojure set

它是如何运作的?

  

(seq#{3 1 22 44})

为什么订单会像

  

(1 3 44 22)

2 个答案:

答案 0 :(得分: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 )。

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

答案 1 :(得分:12)

#{3 1 22 44}是Clojure中的set,不是有序序列。

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

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

创建排序集