Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Clojure中使用disj从集合中删除元素_Clojure_Set - Fatal编程技术网

在Clojure中使用disj从集合中删除元素

在Clojure中使用disj从集合中删除元素,clojure,set,Clojure,Set,嗨,我在试图从集合中移除一个元素时撞到了砖墙 我有一张卡片地图 (def cards { :card1 {:name "Wisp" :type "Monster" :damage 1 :health 1 :cost 0 :charge "t"} :card2 {:name "Spider Tank" :type "Monster" :damage 3 :health 4 :cost 3} :card3 {:n

嗨,我在试图从集合中移除一个元素时撞到了砖墙

我有一张卡片地图

   (def cards
  {
    :card1 {:name "Wisp"              :type "Monster"     :damage 1 :health 1 :cost 0 :charge "t"}
    :card2 {:name "Spider Tank"       :type "Monster"     :damage 3 :health 4 :cost 3}
    :card3 {:name "Boulder Fist Ogre" :type "Monster"     :damage 6 :health 7 :cost 6}

    }
 )
和一副牌

(def deck1 (set (map cards '(:card1 :card2 :card3))))
当我使用disj尝试移除其中一张卡时,什么都没有发生

(disj deck1 :card1)

我真的不知道为什么。

利特温斯基的评论是对的<代码>(disj deck1(:card1 cards))正确

您可以避免将其转换为一个集合,而只需使用
dissoc
。Dissoc在映射而不是集合上工作,因此可以避免额外的类型转换

user=> (dissoc cards :card1)
{:card2 {:name "Spider Tank", :type "Monster", :damage 3, :health 4, :cost 3},
 :card3 {:name "Boulder Fist Ogre", :type "Monster", :damage 6, :health 7, :cost 6}}

首先,这不是典型的clojure成语:

'(:card1 :card2 :card3)
这更简单、更干净:

[:card1 :card2 :card3]
其次,在我看来,你的收藏有点复杂化了。如其他注释所述,您不能
disj
不在其中的密钥;您的
map
函数正在返回与键相关的值
:card1
等,因此尝试在结果上取消键的位置将不会起任何作用

现在,只有当您希望原始映射中的值可能在该映射中重复时,才需要将其转换为一个集合。是否可能有多张Wisp卡具有相同的损坏等?例如,如果:card5和:card8可能是相同的值,则将映射转换为一个集合将删除这些重复项。如果卡片不可能是相同的,那么地图上已经有了无法复制的唯一密钥,因此我不确定将其转换为一组会得到什么。

deck1

#{{:name "Wisp", :type "Monster", :damage 1, :health 1, :cost 0, :charge "t"}
  {:name "Spider Tank", :type "Monster", :damage 3, :health 4, :cost 3}
  {:name "Boulder Fist Ogre", :type "Monster", :damage 6, :health 7, :cost 6}}
此集合不包含值
:card1
。所以
(disj deck1:card1)
没有效果

你想要什么

(apply disj deck1 (filter #(= (:name %) "Wisp") deck1))
。。。它删除了带有
:name
“Wisp”
的所有元素-只有一个

#{{:name "Spider Tank", :type "Monster", :damage 3, :health 4, :cost 3}
  {:name "Boulder Fist Ogre", :type "Monster", :damage 6, :health 7, :cost 6}}

嗯,在
deck1
集合中没有元素
:card1
。可能您要做的是
(disj deck1(:card1 cards))
(clojure.pprint/pprint deck1)
这将从可用卡集中删除卡,而不是将此卡从卡组中取出。