1

我正在学习 clojure 并尝试解决问题。我将地图存储在向量中。每个地图都包含一个 id。例如[{:id 1 :name "abc"} {:id 2 :name "xyz"}]. 该地图还包含更多字段。

我在某处读到,不是使用向量来存储地图,而是可以使用数组映射并取消我的 id 并将其存储为{1 {:name "abc"}, 2 {:name "xyz"}}.

我尝试浏览 clojure 文档,但没有找到一个很好的例子来实现这一点。有人可以帮助我并给我一个很好的例子吗?

4

2 回答 2

1

您可以使用assoc向地图添加值。assoc需要 3 个参数。第一个参数是要添加到的映射,第二个参数是键,第三个是值。该函数返回添加了键值对的旧地图。

例子:

(assoc {} 1 {:name "abc"})

返回

{1 {:name "abc"}}
于 2014-11-20T05:22:58.813 回答
1

您的想法是将:id每个记录映射的条目提升到索引中,同时将其从映射中删除。您最终会得到一个:id-less 记录的映射,而不是完整记录的向量。

以下函数将键fk从地图集合中取出ms

(defn key-by [fk ms]
  (into {} (map (fn [m] [(get m fk) (dissoc m fk)]) ms)))

例如,

(key-by :id [{:id 1 :name "abc"} {:id 2 :name "xyz"}])
;{1 {:name "abc"}, 2 {:name "xyz"}}

笔记:

  • 每条记录都应该有一个:id.
  • :id的 s 最好是不同的,否则你会丢失记录。
  • 不要依赖array-map:这是一个实现细节。修改后的版本很可能是hash-map.
    • 如果您需要按键排序地图,请使用sorted-map.
    • 如果您需要按插入顺序保存记录,请三思。
于 2014-11-21T15:10:04.827 回答