从两个序列中删除重复元素

Xiu*_* Xu 0 clojure

我想知道如何从两个序列中删除重复元素并组合两个序列.例如,

user=>(remove-dup [1 4 7 10 16] [2 7 18 4])
(1 2 10 18 16)
Run Code Online (Sandbox Code Playgroud)

我的代码是:

(defn remove-dup [l1 l2]
  (let [list (concat l1 l2)]
    (loop [l list res '()]
        (if (>= (second (first (frequencies l))) 2) 
            (recur (rest l) res)
            (recur (rest l) (conj res (first (first l))))))))
Run Code Online (Sandbox Code Playgroud)

但是当我运行代码时,我收到了错误消息:

IllegalArgumentException Don't know how to create ISeq from: java.lang.Long  clojure.lang.RT.seqFrom (RT.java:528)
Run Code Online (Sandbox Code Playgroud)

我该如何修复此代码.谢谢!

Sam*_*tep 6

你的错误在这里:

(first (first l))
Run Code Online (Sandbox Code Playgroud)

请记住,l是您尚未处理的所有元素的序列.例如,在第一次迭代中loop,l可能如下所示:

(1 4 7 10 16 2 7 18 4)
Run Code Online (Sandbox Code Playgroud)

你可以从这个是看(first l)1,所以(first (first l))会试图把一个数字作为一个序列,这是行不通的.

如果你(first (first l))用just 替换(first l),你会得到一个,NullPointerException因为你没有基本情况:当你l是空的时候你该怎么办?您可以执行以下操作(其中,,,是当前if表达式的占位符):

(if (empty? l)
  res
  ,,,)
Run Code Online (Sandbox Code Playgroud)

但是,如果我们现在尝试使用该方法,我们仍然无法获得正确的结果:

(remove-dup [1 4 7 10 16] [2 7 18 4])
;=> (4 18 7 2 16 10 1)
Run Code Online (Sandbox Code Playgroud)

人力资源管理.

我可以尝试更多地使用你的代码来使其工作,但有一种更好的方法来解决这个问题.由于您正在尝试删除重复项并且您不关心订单,因此这里的函数clojure.set是正确的工具.我会写remove-dup这样的:

(require '[clojure.set :as set])

(defn remove-dup [c1 c2]
  (let [[s1 s2] (map set [c1 c2])]
    (seq (set/difference (set/union s1 s2) (set/intersection s1 s2)))))
Run Code Online (Sandbox Code Playgroud)

例:

(remove-dup [1 4 7 10 16] [2 7 18 4])
;=> (1 2 16 10 18)
Run Code Online (Sandbox Code Playgroud)