2015-04-23 27 views
0

有兩個地圖:轉化包含HashMap列表插入設置

(def a {:a 1 :b 2 :c 3}) 
(def b {:b 222 :d 4}) 

放入一個載體:

(def l [a b]) 

什麼是構建一套(以獨特的按鍵結構方面)最簡單的方法,其中在發生密鑰衝突(在這種情況下爲b)時,優先級爲左側操作數(本例中爲b 2)。換句話說,我希望得到一個結果:

{:a 1 :b 2 :c 3 :d 4} 

其中兩個來銘記心中的解決方案是:

(apply merge-with (fn [left _] left) l) 
(reduce conj (reverse l)) 

首先一個似乎並不習慣對我來說,第二個擔心我,因爲渴望列表反轉,這聽起來有點無用。任何其他想法?

+0

我沒有看到第一個解決方案的任何問題。爲什麼它不是慣用的? – m0skit0

+2

與第二個解決方案。如果你有很長的列表 - 考慮用慵懶的rseq替換反向。 – iced

+0

@ m0skit0將所有元素拋入一個並不真正關心這兩個參數的「合併」函數(只返回第一個元素)讓我感覺有點不舒服:) – Michal

回答

1

許多其他可能性,其中(reduce #(into %2 %1) l)(或與merge,而不是into)可以考慮。您的merge-with解決方案絕對沒問題。

0

如何

(apply merge (reverse l))

它似乎罰款和simular到第二個。

+0

謝謝,但它仍試圖在此期間反向列表。我會用相當長的地圖列表來使用這個功能,並且倒轉它首先聽起來很可怕:) – Michal

+1

如果你使用'rseq'來代替,這是矢量上的恆定時間。但是確實地顛倒兩個元素集合不會是任何瓶頸。 – noisesmith