Clojure优先级映射

时间:2011-09-30 02:00:23

标签: clojure

我有以下内容,

(let [t (priority-map-by (comparator (fn [[f1 _] [f2 _]]
                                       (< f1 f2)))
                         :b [8 [2 1]])]

  (assoc t :c [8 [2 3]]))

由于某种原因,关联的项目:c在被添加到地图后被修改,我得到的是

{:c [8 [2 1]], :b [8 [2 1]]}

我期待的是,

{:c [8 [2 3]], :b [8 [2 1]]}

我错过了一些明显的原因,为什么项目值被修改了?或者这是一个错误?

2 个答案:

答案 0 :(得分:1)

我没有使用比较器得到我想要的东西,并根据cond返回-1 0 1,

(let [t (priority-map-by (fn [x y]
                             (if (= x y)
                               0
                               (let [[f1 _] x
                                     [f2 _] y]
                                 (if (< f1 f2) -1 1))))

                         :b [8 [2 1]])]

  (assoc t :c [8 [2 3]]))

给了我想要的东西,

{:b [8 [2 1]], :c [8 [2 3]]}

答案 1 :(得分:0)

查看priority-map-by的{​​{3}},它似乎基于sorted-map-by,它认为比较相同的键是相同的。例如:

(sorted-map-by (fn [[a] [b]] (< a b)) [1 2] :foo [1 3] :bar)
=> {[1 2] :bar}

这也适用于sorted-set-by

(sorted-set-by (fn [[a] [b]] (< a b)) [1 2] [1 3] [3 4])
=> #{[1 2] [3 4]}

这是priority-map-by的预期行为,你必须问作者。我认为这是合理的。