IllegalArgumentException键必须为整数

IllegalArgumentException键必须为整数

我有两个 list :

(def xxa ["olp" "xyz"])
(def xxb ["ulove" "alove" "holp" "sholp"])

以及一个试图获取第一列表元素的函数,该元素是第二列表元素的一部分:
(defn in-array
  [array1 array2]
  (for [s1 array1 :when (some #(.contains %1 s1) array2)] s1))

(数组xxa xxb)应返回[“olp”]

但我得到:
IllegalArgumentException Key must be integer  clojure.lang.APersistentVector.invoke

我不明白那是什么意思。有人可以给我一些光吗?

最佳答案

这是为了使以后的讨论清楚地回答上面的讨论。如果我错过了什么,请告诉我或进行编辑:

从原始示例开始:

user> (def xxa ["olp" "xyz"])
#'user/xxa
user> (def xxb ["ulove" "alove" "holp" "sholp"])
#'user/xxb
user> (defn in-array [array1 array2]
        (for [s1 array1 :when (some #(.contains %1 s1) array2)] s1))
#'user/in-array

正如彼得指出的那样,额外的一组()会导致此错误:
user> (in-array (xxa xxb))
IllegalArgumentException Key must be integer  clojure.lang.APersistentVector.invoke (APersistentVector.java:284)

其中包含的代码多于显示情况所需的代码,因此我们可以将其缩减为:
user> (xxa xxb)
IllegalArgumentException Key must be integer  clojure.lang.APersistentVector.invoke (APersistentVector.java:284)

这是显示问题的最小情况。如果我们更改此示例以传递期望的类型,则可以看到向量在作为函数调用时采用一个数字并自己查找该数字。
user> (xxa 1)
"xyz"

因此,最后我们可以更正此调用并获得预期的输出,几乎完全是这样:
user> (in-array xxa xxb)
("olp")

结果是for表达式中的一个(惰性)序列,并且user3166747询问了一个向量(非惰性和随机访问),我们可以通过向vec添加一个调用来获得该向量:
user> (defn in-array [array1 array2]
        (vec (for [s1 array1 :when (some #(.contains %1 s1) array2)] s1)))
#'user/in-array

user> (in-array xxa xxb)
["olp"]

现在完全匹配。

关于Clojure:IllegalArgumentException键必须为整数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29913121/

10-13 07:08