【问题标题】:How to keep the map order in Clojure?如何在 Clojure 中保持地图顺序?
【发布时间】:2014-11-16 05:42:10
【问题描述】:

我在我的代码中定义了一个地图,例如:

(def templates {:list1 {:create_time "create_time"
                        :recharge_amount "recharge"
                        :invest_amount "invest"
                        ;; something else
                        }
                :list2 {:create_time "ct"
                         ;; something else
                        }
                ;;something else 
                })

我希望地图按照我的定义保持顺序。 如何解决?

【问题讨论】:

  • 使用排序图(见sorted-map)。
  • @DiegoBash sorted-map 不会保持插入顺序(当然,除非您按排序顺序插入键)。
  • 你可以保留一个平行的键向量,就像插入的一样。在这里,(def template-log [:list1 :list2])
  • 您可以与 Java 互操作并使用 LinkedHashMap。

标签: clojure


【解决方案1】:

如果您的数据不会改变,您可以使用array-map

(def templates
  (array-map
    :list1 {}
    :list2 {}
    :list3 {}))

(seq templates)
;; => ([:list1 {}] [:list2 {}] [:list3 {}])

(keys templates)
;; => (:list1 :list2 :list3)

您问为什么要使用常量数据进行约束?好吧,基本上任何修改操作后,数组映射都可能变成哈希映射(如果它的内容变得太大而无法提供有效的查找)。

或者,如果您对外部依赖项持开放态度,您可以查看amalloy/ordered 是否符合您的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 2015-08-25
    • 1970-01-01
    • 2022-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多