Распределение по круговой схеме в Clojure - PullRequest
0 голосов
/ 05 декабря 2018

Мне было интересно, есть ли у кого-нибудь ресурсы по распределению циклического перебора в Clojure?

У меня есть функция, которая разбивает переданные данные на отдельные карты, например:

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

  (partition split data)
 )

Myпроблема в том, что я не уверен, как распределить эти карты по количеству определенных «наборов».Я думаю, что мог бы создать карты заранее, используя что-то вроде этого:

(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 голосов
/ 06 декабря 2018

Я покажу, как мне поступить с такой проблемой.Clojure вполне способствует такого рода экспериментам.(Литвински эффективно дал этот ответ в своем комментарии.)

Начните с данных.

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

Обратите внимание, что если ввод нечетной длины, функция игнорирует последний элемент.

Мой опыт показывает, что всякий раз, когда вы хотите выполнить какие-либо преобразования для некоторых данных, стоит просто вставить данные в макрос последнего потока (->>) и продолжать его использовать.Эта проблема довольно проста, но метод работает и для сложных преобразований.

...