Collections 在持久映射中是否有交换两个键值的Clojure函数?

Collections 在持久映射中是否有交换两个键值的Clojure函数?,collections,clojure,clojurescript,Collections,Clojure,Clojurescript,是否有Clojure函数在持久映射中交换两个键的值? 我的意思是这样的: (defn swap-keys [map k1 k2] (let [f (get map k1) s (get map k2)] (assoc map k1 s k2 f))) (swap-keys {:a 1 :b 2 :c 3 :d 4} :a :c) ;; => {:a 3, :b 2, :c 1, :d 4} 据我所知,最好的情况是: 如果需要,您可以使用它进行双向交换以外的操作: (cloj

是否有Clojure函数在持久映射中交换两个键的值? 我的意思是这样的:

(defn swap-keys [map k1 k2]
  (let [f (get map k1) s (get map k2)]
    (assoc map k1 s k2 f)))

(swap-keys {:a 1 :b 2 :c 3 :d 4} :a :c)
;; => {:a 3, :b 2, :c 1, :d 4}
据我所知,最好的情况是:

如果需要,您可以使用它进行双向交换以外的操作:

(clojure.set/rename-keys {:a 1 :b 2 :c 3 :d 4}
                         {:a :b,
                          :b :c,
                          :c :d,
                          :d: :a})
;; {:b 1, :c 2, :d 3, :a 4}

编辑:与“幼稚”解决方案相比,这种方法的一个好处(可能)是它执行检查以确保必要的键实际存在:

=> (defn swap [m k1 k2] (assoc m k1 (m k2) k2 (m k1)))
=> (swap {:a 1 :b 2 :c 3} :a :d)
;; {:a nil, :b 2, :c 3, :d 1}

=> (clojure.set/rename-keys {:a 1 :b 2 :c 3} {:a :d, :d :a})
;; {:b 2, :c 3, :d 1}
据我所知,最好的情况是:

如果需要,您可以使用它进行双向交换以外的操作:

(clojure.set/rename-keys {:a 1 :b 2 :c 3 :d 4}
                         {:a :b,
                          :b :c,
                          :c :d,
                          :d: :a})
;; {:b 1, :c 2, :d 3, :a 4}

编辑:与“幼稚”解决方案相比,这种方法的一个好处(可能)是它执行检查以确保必要的键实际存在:

=> (defn swap [m k1 k2] (assoc m k1 (m k2) k2 (m k1)))
=> (swap {:a 1 :b 2 :c 3} :a :d)
;; {:a nil, :b 2, :c 3, :d 1}

=> (clojure.set/rename-keys {:a 1 :b 2 :c 3} {:a :d, :d :a})
;; {:b 2, :c 3, :d 1}

我已经接受了这个答案,但我仍然愿意听到其他解决方案我已经接受了这个答案,但我仍然愿意听到其他解决方案可能的副本;在这种情况下,映射和向量之间没有区别。@Elogent我已经知道如何达到预期效果,我正在Clojure标准库中搜索一个函数来完成这项工作。所以,我的问题不是如何做到这一点,而是Clojure的职能(如果有的话)是做这项工作的,因此你提到的问题与我的不同。在任何情况下,两个不同的问题可能会得到相同的答案。:)@高德雷当然可以,但情况并非如此。甚至连反应都是截然不同的。我的问题的一个可能答案是-
clojure.设置/重命名键
(一个标准的clojure函数),而对上述问题的答案是一个用户定义的函数;在这种情况下,映射和向量之间没有区别。@Elogent我已经知道如何达到预期效果,我正在Clojure标准库中搜索一个函数来完成这项工作。所以,我的问题不是如何做到这一点,而是Clojure的职能(如果有的话)是做这项工作的,因此你提到的问题与我的不同。在任何情况下,两个不同的问题可能会得到相同的答案。:)@高德雷当然可以,但情况并非如此。甚至连反应都是截然不同的。我的问题的一个可能答案是-
clojure.set/rename keys
(一个标准clojure函数)下面的这个问题,而上述问题的答案是一个用户定义的函数。