【发布时间】:2013-10-08 16:15:52
【问题描述】:
我正在尝试将 SQL 查询的最大和最小结果提取到 Clojure 中,以便对它们执行数学分析,但我不确定为什么会出错。
我已经在代码中使用了 max 和 min 函数来尝试确定这些结果,尽管我不断收到两个错误,这些错误似乎与我使用 :counter 关键字的方式有关。
从 SQL 查询返回到地图中的数据如下所示:
{:date1 "20131007", :data "object1", :counter 1000}
{:date1 "20131007", :data "object2", :counter 50}
{:date1 "20131007", :data "object3", :counter 230}
当我使用这段代码时:
minvalue(min(map(keyword :counter)data2))
maxvalue(max(map(keyword :counter)data2))
valrange(- maxvalue minvalue)
valpc(* (/ valrange 100) 10)
x(- maxvalue valpc)
我显然希望将 minvalue 设置为 50,并将 maxvalue 设置为 1000,尽管我收到此错误:
java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to java.lang.Number
如果我从代码中删除 map 函数并再次运行它,我会收到以下错误:
java.lang.ClassCastException: clojure.lang.Keyword cannot be cast to java.lang.Number
感谢任何帮助,因为我完全陷入困境(而且我可能是 Clojure 的新手,这可能很明显)!谢谢
【问题讨论】:
-
关于性能的说明:如果您有大量的地图要处理,使用reduce(类似
(reduce min (:counter (first maps)) (map :counter (rest maps))))将比apply 更有效。