我一般會去用以下方法:
- 填充集合到最長的一個
- 地圖的尺寸都,將集合中的每個項目填充到最長的映射項目的大小以選擇結果值。
這是更好的代碼來說明吧:
首先,讓我們做了一些輔助功能:
(defn max-count [coll1 coll2] (max (count coll1) (count coll2)))
它的名字說自明。
(defn fill-up-to [coll size] (take size (concat coll (repeat nil))))
這一個填滿了nil
S中收集了一些大小:
user> (fill-up-to [1 2 3] 10)
(1 2 3 nil nil nil nil nil nil nil)
現在合併功能:
(defn merge-colls [v1 v2 default-val]
(let [coll-len (max-count v1 v2)
comp-len (max-count (first v1) (first v2))]
(mapv (fn [comp1 comp2]
(mapv #(or %1 %2 default-val)
(fill-up-to comp1 comp-len)
(fill-up-to comp2 comp-len)))
(fill-up-to v1 coll-len)
(fill-up-to v2 coll-len))))
外mapv
工作從充滿初始參數進行的募款最長的一個長度(coll-len
),所以在問題的背景下,它將是:
(mapv some-fn [[a b c] [d e f] [g h i] nil]]
[[a b] [d e] [g h] [j k]])
內mapv在內矢量操作,(在這種情況下3)填充到comp-len
:
(mapv #(or %1 %2 default-val) '[a b c] '[d e nil])
...
(mapv #(or %1 %2 default-val) '[nil nil nil] '[j k nil])
讓我們來測試一下:
user> (let [v1 '[[a b c] [d e f] [g h i]]
v2 '[[a b] [d e] [g h] [j k]]]
(merge-colls v1 v2 'l))
[[a b c] [d e f] [g h i] [j k l]]
確定它的工作原理就像我們要。
現在如果你看一下merge-colls
,您可能會注意到圖形的重複:
(mapv some-fn (fill-up-to coll1 size)
(fill-up-to coll2 size))
我們可以搬進搬出這個模式功能消除重複:
(defn mapv-equalizing [map-fn size coll1 coll2]
(mapv map-fn (fill-up-to coll1 size) (fill-up-to coll2 size)))
和重寫我們的合併:
(defn merge-colls [v1 v2 default-val]
(let [coll-len (max-count v1 v2)
comp-len (max-count (first v1) (first v2))]
(mapv-equalizing (fn [comp1 comp2]
(mapv-equalizing #(or %1 %2 default-val)
comp-len comp1 comp2))
coll-len v1 v2)))
測試:
user> (let [v1 '[[a b c] [d e f] [g h i]]
v2 '[[a b] [d e] [g h] [j k]]]
(merge-colls v1 v2 'l))
[[a b c] [d e f] [g h i] [j k l]]
好的。現在我們可以通過刪除集合大小綁定縮短,因爲我們需要這些值只有一次:
在REPL
(defn merge-colls [v1 v2 default-val]
(mapv-equalizing
(partial mapv-equalizing
#(or %1 %2 default-val)
(max-count (first v1) (first v2)))
(max-count v1 v2) v1 v2))
:
user> (let [v1 '[[a b c] [d e f] [g h i]]
v2 '[[a b] [d e] [g h] [j k]]]
(merge-colls v1 v2 'l))
[[a b c] [d e f] [g h i] [j k l]]
如果分量矢量不匹配,會發生什麼:'[[AB ]]'和'[[cde]]',說? – Thumbnail