如何获得clojure数组映射以在assoc后保持插入顺序?

如何获得clojure数组映射以在assoc后保持插入顺序?,clojure,hashmap,array-map,Clojure,Hashmap,Array Map,我有一个数组映射,我正在将一些值关联到其中。在一定大小之后,返回的值是一个PersistentHashMap,而不是原始的PersistentArrayMap。我在一些网站上读到过这种行为。即使在assoc之后,是否有任何方法强制执行插入顺序 我确实有一个单独的函数,它将获取一个ash map和一个键向量,并返回一个“新的”数组map,其中键的顺序如下,但这意味着对于每个assoc,我必须先提取键,将新键与向量合并,然后创建一个新的数组映射。看起来很笨拙,即使是用单独的函数编写的 是否有一种更直

我有一个
数组映射
,我正在
将一些值关联到其中。在一定大小之后,返回的值是一个
PersistentHashMap
,而不是原始的
PersistentArrayMap
。我在一些网站上读到过这种行为。即使在
assoc
之后,是否有任何方法强制执行插入顺序

我确实有一个单独的函数,它将获取一个
ash map
和一个键向量,并返回一个“新的”
数组map
,其中键的顺序如下,但这意味着对于每个assoc,我必须先提取键,将新键与向量合并,然后创建一个新的数组映射。看起来很笨拙,即使是用单独的函数编写的

是否有一种更直接的语言支持的方法来保持插入顺序,即使是在大型ish(>10,但<50)键数组映射上

如果相关的话,我将使用数组映射列表作为数据输入到白炽灯数据集中,然后输出到excel。save xls函数保持键/列的顺序


感谢您可以使用有序映射:

我建议您同时保留条目映射和键向量,以便您可以跟踪键插入的顺序,但看起来这正是此库中的数据结构在后台所做的。谢谢分享!实际上,这里有一个未解决的问题,这种方法对于除dissoc之外的所有东西都非常有效-您不能仅仅从向量中删除一个条目。我尝试了许多不同的方法,比如保持从索引到值的排序映射;这对dissoc有好处,但对其他一切都很慢。如果你想出一个很酷的解决方案,让我知道!斯卡拉有一个这样做,但它是可变的,所以它能够解开在其双链表中间节点。也许您可以将该方法应用于数据结构的瞬态版本,但要为不可变映射找到一个好的答案并不那么容易。我打赌这个问题的一个很好的解决方案实际上是可以发布的。谢谢,现在我想起来了,我想我以前用过这个。我被分类的地图弄糊涂了。那么,如果clojure不打算维护插入顺序,为什么它会有一个数组映射呢?对于小映射,您可以避免支付哈希表的固定开销;当贴图变大时,数组贴图不再有效。