2016-03-23 2 views
1

永続マップ内の2つのキーの値を入れ替えるClojure関数はありますか?私が知っている最高ののthisある永続マップに2つのキー値を入れ替える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} 
+0

可能な重複[ベクトル内の2つの要素を交換する慣用的な方法は何ですか](HTTP: //stackoverflow.com/questions/5979538/what-is-the-ietomatic-way-to-swap-two-elements-in-a-vector);この場合、マップとベクトルとの間に差異はない。 –

+0

@Elogent私はすでに所望の効果を達成する方法を知っています。私はむしろ、この仕事をしてくれるClojure標準ライブラリの機能を探しています。 私の質問はこれを行う方法ではありませんが、Clojureの機能(もしあれば)がこの仕事をしているので、言及した質問は私のものとは異なります。 – foki

+0

いずれにしても、2つの別個の質問が同じ回答を認めてもよい。 :) – galdre

答えて

12

: は、私はこのような何かを意味

(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} 
+0

私はこの回答を受け入れましたが、私はまだ他の解決策を聞いています。 :) – foki

関連する問題