在Clojure中更新集合?

时间:2011-07-31 08:15:17

标签: clojure set

我在这样的集合中有一系列项目:

(def my-set
  #{
    {:id "ab" :a 1 :b 2}
    {:id "abc" :a 1 :b 2}
    {:id "abcd" :a 1 :b 2}
  }
)

:我希望更新以下项目之一:

(update-in-set    my-set  :id  "abc"   {:id "abc" :a 6 :b 20})

。会回来:

  #{
    {:id "ab" :a 1 :b 2}
    {:id "abc" :a 6 :b 20}
    {:id "abcd" :a 1 :b 2}
  }

:是否有任何Clojure内置功能或其他简单的方法来执行此操作?

更新

最后我这样做了:

(defn update-in-set    [my-set  key  value  new-record]
  (merge (clojure.set/select #(not= (get % key) value) my-set ) new-record)
)

1 个答案:

答案 0 :(得分:3)

我想知道你是不是应该使用地图而不是一个集合,以id为关键。然后,您可以使用assoc轻松执行您想要执行的操作。

您遇到问题,因为集合并不真正想要更新值 - 每个项目都是唯一的,无论是否存在 - 所以您需要做的是删除旧值并添加新值。使用conjdisj时,我可以更轻松地完成此操作:

(conj (disj #{'a 'b 'c} 'a) 'e)

哪会删除'a并添加'e。这假设你有办法从“密钥”中获取完整的项目。