【问题标题】:How to get a clojure array-map to maintain insertion order after assoc?如何在关联后获取 clojure 数组映射以维护插入顺序?
【发布时间】:2012-08-20 08:04:23
【问题描述】:

我有一个array-mapassoc,其中包含一些值。在一定大小之后,返回值是PersistentHashMap,而不是原来的PersistentArrayMap。我在一些网站上读到过这种行为。即使在assoc 之后,有什么方法可以强制插入顺序吗?

我确实有一个单独的函数,它将接受一个 ash-map 和一个键向量,并按此顺序返回一个带有键的“新鲜”array-map,但这意味着对于每个 assoc,我必须提取首先是键,cons/conj 向量的新键,然后创建一个新的数组映射。看起来很笨拙,即使写在一个单独的函数中。

是否有更直接的语言支持方式来保持插入顺序,即使在大键(> 10,但

如果相关,我使用数组映射列表作为 incanter 数据集的数据,然后输出到 excel。 save-xls 函数保持键/列的顺序。

谢谢

【问题讨论】:

    标签: clojure hashmap array-map


    【解决方案1】:

    您可以使用有序地图:https://github.com/flatland/ordered

    【讨论】:

    • 我建议保留条目映射和键向量,以便您可以跟踪插入键的顺序 - 但看起来这正是数据这个库中的结构是在幕后工作的。感谢分享!
    • 这里实际上有一个未解决的问题,因为这种方法对除dissoc 之外的所有内容都非常有效 - 您不能只从向量中删除一个条目。我尝试了许多不同的方法,比如保持从索引到值的排序映射;这对 dissoc 有好处,但对其他一切都很慢。如果您想出一个很酷的解决方案,请告诉我!
    • Scala 有一个LinkedHashMap 可以有效地执行此操作——但它是可变的,因此它能够取消其双向链表中间的节点的链接。也许您可以将该方法应用于数据结构的瞬态版本,但要为不可变映射找到一个好的答案并不容易。我敢打赌,这个问题的一个好的解决方案实际上是可以发布的。
    • 谢谢,现在想起来,我想我以前用过这个。我对排序地图感到困惑。那么,如果 clojure 不打算维护插入顺序,为什么还要有一个数组映射呢?
    • 对于小地图,您可以避免支付哈希表的固定开销;当映射变大时,数组映射不再高效。
    猜你喜欢
    • 2012-03-22
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 2011-10-25
    • 2020-07-31
    相关资源
    最近更新 更多