检查字符串等于哈希映射值Clojure - 无法强制转换

时间:2016-01-31 19:47:44

标签: clojure hashmap

所以我有一个函数,我正在做两个if语句,第一个似乎正在工作,但第二个是产生错误

ClassCastException java.lang.String cannot be cast to clojure.lang.IFn  user/sort-maps (NO_SOURCE_FILE:1559)

该函数传入两个Map“m1 + m2”和两个字符串“s1 s2” 问题是: (if-not (= (get map1 s2)(s1))

我想要做的是看看字符串“s1”是否等于“map s2”中值的字符串,但我不断收到该错误。这是我的功能

(defn sort-maps [map1 map2 s2 s1]
  (if-not (contains? map1 s2)
    [(assoc map1 s2 s1) map2]
    [map1 (assoc map2 s2 s1)])

  (if-not (= (get map1 s2)(s1))
    [(dissoc map2 (get map1 s2))]
    [map1 (assoc map2 s2 s1)]))

我的意见:

"door" "rood" "odor" "pen" "list" "silt" "#"

我想要的输出是:

{"enp" "pen"}

因为我只想在输入

中返回不能组成任何其他单词的单词

2 个答案:

答案 0 :(得分:2)

s1是一个字符串,但通过将其包装在parens中,您可以进行函数调用。字符串不是一个函数,因此您可以看到类型错误。

您可能需要(if-not (= (get map1 s2) s1))

但你似乎有更深层次的误解。 Clojure数据结构不可变。这意味着以下内容:

user=> (def my-map {:a 1 :b 2})
#'user/my-map
user=> (assoc my-map :c 3)
{:a 1, :b 2, :c 3}
user=> my-map
{:a 1, :b 2}
user=> (dissoc my-map :a 1)
{:b 2}
user=> my-map
{:a 1, :b 2}

因此,您无法像使用ruby或其他语言那样更改值。

答案 1 :(得分:2)

munk正确地指出了你的错误来源:(s1)告诉Clojure将s1作为一个没有参数的函数调用。但是,即使在修复此问题之后,您的代码也不太可能按照您的预期执行。

这是函数sort-maps的主体(带有munk的更正):

(if-not (contains? map1 s2)
    [(assoc map1 s2 s1) map2]
    [map1 (assoc map2 s2 s1)])

(if-not (= (get map1 s2) s1)
    [(dissoc map2 (get map1 s2))]
    [map1 (assoc map2 s2 s1)])

执行第一个if-not语句并生成结果(一对更新的map1map2或一对map1并更新map2)被扔掉了。由于Clojure中的映射是不可变的,assoc不会在现有映射中添加新条目 - 而是创建新映射。所以,这个函数体完全等同于

(if-not (= (get map1 s2) s1)
    [(dissoc map2 (get map1 s2))]
    [map1 (assoc map2 s2 s1)])

我不确定你在这做什么,所以无法帮助你。