Я только начал изучать Clojure и функциональное программирование и у меня трудное время, пытаясь реализовать следующую задачу:Clojure - Удаление элементов из вектора внутри петли
У меня есть вектор векторов, как это [[аЬ] [ac] [bc] [cd] [db]]. И мне нужно выполнить итерацию, удалив элементы, которые появляются во втором столбце, который уже появился во втором столбце. Например, элементы [b c] и [d b] (поскольку и c, и b уже появились во втором столбце). Мне удалось получить функцию, которая удаляет один элемент в то время, но мне нужно прокручивать вектор для каждого элемента, проверяя и удаляя элементы. Как я могу это достичь? Я думал об использовании рекурсии для достижения этого, но каждая попытка оказалась неудачной. Извините, если это тривиальный вопрос, но я застрял в этом.
Например
Вход: [[аб] [ас] [Ьс] [CD] [объявления] [быть]]
Ouput (ожидаемый): [[аб] [ переменный ток] [CD] [быть]]
Удалены пункты: [[Ьс] [объявления]]
Как вы можете видеть, как с и d уже появились на предыдущих пунктах [AC] и [ cd] соответственно, поэтому Мне нужно удалить элементы [b c] и [a d].
До сих пор, у меня есть следующий код
Эта функция возвращает вектор элементов, подлежащих удалению. В нашем случае он возвращает вектор [[Ьс] [объявления]]
(defn find-invalid [collection-data item-to-check]
(subvec (vec (filter #(= (second %) item-to-check) collection-data)) 1))
(defn find-invalid [collection-data item-to-check]
(subvec (vec (filter #(= (second %) item-to-check) collection-data)) 1))
Эта другая функция удаляет один элемент в то время от исходного вектора по заданному индексу элемента
(defn remove-invalid [collection-data item-position]
(vec (concat (subvec collection-data 0 item-position) (subvec collection-data (inc item-position)))))
Эта последняя функция, что я сделал, чтобы проверить эту логику
(defn remove-invalid [original-collection ]
(dorun (for [item original-collection]
[
(dorun (for [invalid-item (find-invalid original-collection (second item))]
[
(cond (> (count invalid-item) 0)
(println (remove-invalid original-collection (.indexOf original-collection invalid-item)))
)
]))
])))
Я думаю, что рекурсия может решить мою проблему, но я был бы признателен за любую помощь, чтобы получить, что сделано :).
Заранее спасибо.
большой вопрос. Я уверен, что pro clojure придет на помощь =] – sova