替换Clojure向量中的重复项

Zad*_*den 3 vector clojure

我试图用空字符串替换向量中的重复项.但是,我能找到的唯一功能是删除重复项,而不是替换它们.我该怎么办

["Oct 2016" "Oct 2016" "Nov 2016" "Nov 2016" "Nov 2016" "Nov 2016"]

并输出:

["Oct 2016" "" "Nov 2016" "" "" ""]

我能找到的所有东西都会返回["Oct 2016" "Nov 2016"]我正在通过嵌套来实现所需的输出doseq,但它似乎效率低下.有没有更好的方法来实现这一目标?谢谢!

erd*_*dos 5

这是一个解决方案的策略.

  1. loop 在矢量的项目.
  2. 维护一个set访问过的项目.它可用于检查唯一性.
  3. 对于每个项目:如果集合包含当前项目,则插入""结果向量.
  4. 如果当前项是唯一的,则将其插入结果向量和集合中.
  5. 访问所有项目时返回结果向量.
  6. 可选:使用瞬态结果向量以获得更好的性能.

码:

(defn duplicate->empty [xs]
  (loop [xs     (seq xs)
         result []
         found #{}]
        (if-let [[x & xs] (seq xs)]
          (if (contains? found x)
            (recur xs (conj result "") found)
            (recur xs (conj result x) (conj found x)))
          result)))
Run Code Online (Sandbox Code Playgroud)

打电话给:

(duplicate->empty ["Oct 2016" "Oct 2016" "Nov 2016" "Nov 2016" "Nov 2016" "Nov 2016"])
=> ["Oct 2016" "" "Nov 2016" "" "" ""]
Run Code Online (Sandbox Code Playgroud)