我想知道是否有人对Clojure中的循环分发有任何资源?
我有一个函数,可以将传递的数据分成单独的映射,就像这样:
(defn round-robin
"Divides the dataset into distinct maps using
round robin distribution"
[data sets split]
(partition split data)
)
我的问题是我不确定如何将这些映射分布到定义的“集合”中。我想我可以像这样先创建地图:
(defn create-map-set
"Creates a set of (count) maps"
[count set]
(if(= count 0) set (recur (- count 1) (conj set
'())))
)
但是由于我无法引用索引,因此将数据与特定映射合并变得更加困难。
这就是我所期望的:
Input: ((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))
Output: ((2 5 1 4) (3 2 3 7) (7 3 4 2))
在向地图添加数据时,我基本上是1 2 3、1 2 3。
答案 0 :(得分:3)
我将说明如何解决此类问题。 Clojure非常有助于这种实验。 (leetwinski在他的评论中有效地给出了这个答案。)
从数据开始。
channel_id
将其拖放到线程宏中
'((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))
分区中途
(->> '((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))) ===> ((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))
这时,我们得到了两个元素(总是)。如果我们可以将它们传递到(->> '((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))
(partition 3)) ===> (((2 5) (3 2) (7 3)) ((1 4) (3 7) (4 2)))
中,然后将每两个元素串联起来,那么我们就完成了。所以,
map
现在,删除硬编码的内容:
(->> '((2 5) (3 2) (7 3) (1 4) (3 7) (4 2))
(partition 3)
(apply map concat)) ===> ((2 5 1 4) (3 2 3 7) (7 3 4 2))
请注意,如果输入为奇数长度,则函数将忽略最后一个元素。
我的经验是,每当您想对某些数据进行一些转换时,只需将数据推送到线程最后的宏((defn round-robin [s]
(let [half-len (quot (count s) 2)]
(->> s
(partition half-len)
(apply map concat))))
)中并不断加以改进就很有意义。这个问题很简单,但是该方法也适用于复杂的转换。