Clojure中的循环分布

时间:2018-12-05 19:00:23

标签: algorithm clojure round-robin

我想知道是否有人对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。

1 个答案:

答案 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)))) )中并不断加以改进就很有意义。这个问题很简单,但是该方法也适用于复杂的转换。