algorithm - Clojure 中的循环分配

标签 algorithm clojure round-robin

我想知道是否有人有关于 Clojure 中循环分配的任何资源?

我有一个函数将传递的数据拆分成单独的映射,如下所示:

(defn round-robin
  "Divides the dataset into distinct maps using 
round robin distribution"
  [data sets split]

  (partition split data)
 )

我的问题是我不确定如何将这些 map 分配到定义的“集合”数量中。我在想我可以用这样的东西事先创建 map :

(defn create-map-set
  "Creates a set of (count) maps"
  [count set]
  (if(= count 0) set (recur (- count 1) (conj set 
'())))
 )

但由于我无法引用索引,因此很难将数据与特定 map 合并。

这是我期待的:

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))

在向 map 添加数据时,我基本上是 1 2 3、1 2 3。

最佳答案

我会说明我是如何解决这个问题的。 Clojure 非常有利于这种实验。 (leetwinski 在他的评论中有效地给出了这个答案。)

从数据开始。

'((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))))

请注意,如果输入是奇数长度,函数将忽略最后一个元素。

我的经验是,每当您想对某些数据进行一些转换时,只需将数据推送到线程最后的宏 (->>) 并继续对其进行处理是值得的。这个问题很简单,但该方法也适用于复杂的转换。

关于algorithm - Clojure 中的循环分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53639060/

相关文章:

clojure - 何时评估集合的唯一元素?

dictionary - 如何在 Clojure 中将 LazySeq 字符转换为字符串?

java - 双循环赛

python - 在重复迭代期间更有效的洗牌

ruby - 根据另一个数组的元素对一个数组进行排序

parsing - 编写解析器(用于标记语言): Theory & Practice

php - 在 Twilio 中创建循环

javascript - 对字符串中的字母进行排序

java - 求除数的奇数

scheduling - 为什么工作没有平均分配给 gunicorn worker ?