【发布时间】:2011-10-05 13:57:08
【问题描述】:
我有一个列表,其中可能包含比较相等的元素。我想要一个类似的列表,但删除了一个元素。所以从 (:a :b :c :b :d) 我希望能够“删除”只是 one :b 得到 (:a :c :b :d)。
上下文是纸牌游戏中的一手牌,其中有两副标准纸牌在玩,因此可能会有重复的牌,但仍一次打出一张。
我有工作代码,见下文。在 Clojure 中是否有更惯用的方法来做到这一点?
(defn remove-one [c left right]
(if (= right ())
left
(if (= c (first right))
(concat (reverse left) (rest right))
(remove-one c (cons (first right) left) (rest right)))))
(defn remove-card [c cards]
(remove-one c () cards))
这是我不久前得到的 Scala 答案:What is an idiomatic Scala way to "remove" one element from an immutable List?
【问题讨论】:
-
作为脚注,我查看了这个问题的 Scala 版本的首选答案的源代码。事实证明,Scala 中的 diff 函数使用可变哈希来计算要从多重集中删除的出现次数。
-
只是为了澄清:在这里哪个 :b 算作重复有关系吗?从示例输出中,您“删除”了第一个 :b,但它仍然等同于删除了第二个 :b 吗? [abcbd -> acdb,但是 abcd 也可以接受吗?]
-
@monojohnny,abcd 对我的用例同样适用。