我一般会去用以下方法:
- 填充集合到最长的一个
- 地图的尺寸都,将集合中的每个项目填充到最长的映射项目的大小以选择结果值。
这是更好的代码来说明吧:
首先,让我们做了一些辅助功能:
(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