Clojure中集合的更新?

Clojure中集合的更新?,clojure,set,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 "ab

我在一组中有一系列项目,如下所示:

(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)
)

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

您遇到了一些问题,因为集合实际上没有更新值的想法-每个项都是唯一的,或者存在,或者不存在-所以您需要做的是删除旧值并添加新值。使用
conj
disj
可以更轻松地实现这一点,我认为:

(conj (disj #{'a 'b 'c} 'a) 'e)
这将删除“a”并添加“e”。这假设您可以通过某种方式从“键”获取完整的项