2016-01-31 90 views
0

我想在闭包中使用散列映射,因为我有一个for循环,将已排序的字符串和未排序的字符串传递给我的函数,我想要做的是两个if哈希地图上发言Clojure散列映射查询键和值

1 if语句是

if hash-map doesnt contain string "x" 
put x in a new hash-set 

第二if语句是

if hash-map key "x" value is not equal to "y" 
remove "x" from hash-set 

这是我迄今为止

(defn transform3 [y] 
(let [x (sort-string (str/lower-case y)) 
    my-hash-map (hash-map) 
    hashmap2 (hash-map)] 
(if-not (contains? my-hash-map x) 
    (my-hash-map x, y) 
    (hashmap2 y)) 

(if-not (get hash-map x) y) 
(dissoc hashmap2 x) 

;;remove from hash-set to do... 
)) 

如果声明允许我使用诸如“get”之类的语句包含“put”等等,我该怎么办?

+0

如果您将我的答案纳入问题中,那么我的答案不再有任何意义。我可能会最终删除它。我很确定这不是应该如此工作的方式。 –

+0

你应该接受我的答案,然后撰写另一个新的问题。你也可以阅读'assoc'和'dissoc'。还有'conj'。然后集合和地图之间的区别。很可能你应该在你的问题中使用一套。 –

回答

1

hash-map是一个函数。当你调用它(使用parens)时,它会返回一个实际的哈希映射。我已更改您的代码以通过该特定的错误消息。

(defn add-to-map [y] 
    (let [x (sort-string (str/lower-case y)) 
     my-hash-map (hash-map)] 
    (if-not (contains? my-hash-map x) 
    (hash-map x, y) 
     (hash-set y)) 
    (if-not (get hash-map x) y) 
     ;;remove from hash-set to do... 
    )) 
+0

啊对,所以我将不得不声明它的名称来引用它? 我将如何从集中删除?在那一刻我只是使用打印语句来检查它是否经过了if语句 – Freeman

+1

您通常使用'dissoc'从散列图中删除。你的代码中没有任何集合,所以我假定你的意思是哈希映射。我建议通过4cljure问题来处理语言。 –

+0

所以我已经更新原始帖子,所以我想我现在有一个哈希映射在X和Y.然后把Y到HashMap 2,然后如果X不等于Y从HashMap2删除Y?会是正确的吗?感谢您的建议,我从来没有听说过4clojure问题 – Freeman