【问题标题】:Is there Clojure function that swaps two keys values in persistent map?是否有 Clojure 函数可以交换持久映射中的两个键值?
【发布时间】:2016-07-11 08:20:22
【问题描述】:

是否有 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}

【问题讨论】:

  • What is the idiomatic way to swap two elements in a vector 的可能重复项;在这种情况下,地图和矢量没有区别。
  • @Elogent 我已经知道如何达到预期的效果,我宁愿在 Clojure 标准库中寻找一个可以为我完成这项工作的函数。所以,我的问题不是如何做到这一点,而是 Clojure 函数(如果有的话)做这项工作,因此你提到的问题与我的不同。
  • 在任何情况下,两个不同的问题可能承认相同的答案。 :)
  • @galdre 当然可以,但情况并非如此。甚至反应是不同的。我的问题的一个可能答案是下面的这个 - clojure.set/rename-keys(标准 Clojure 函数),而对上述问题的答案是用户定义的函数。

标签: collections clojure clojurescript


【解决方案1】:

我知道的最好的是this

(clojure.set/rename-keys {:a 1 :b 2 :c 3 :d 4}
                         {:a :c, :c :a})
;; {:c 1, :b 2, :a 3, :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}

【讨论】:

  • 我已经接受了这个答案,但我仍然愿意听取其他解决方案。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 2015-03-09
相关资源
最近更新 更多