我想知道如何从两个序列中删除重复元素并组合两个序列.例如,
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)
我该如何修复此代码.谢谢!
你的错误在这里:
(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)
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |