我试图将SQL查询的最大和最小结果提取到Clojure中,以便我可以对它们进行数学分析,但我不确定为什么会出现错误。
我已经在代码中使用了max和min函数来尝试确定这些结果,尽管我不断收到两个与我使用:counter 关键字的方式相关的错误。< / p>
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的新手中表现得相当不错)!感谢
答案 0 :(得分:6)
您的代码有一些变化:
考虑到前两行的共性
(def data [{:date1 "20131007", :data "object1", :counter 1000}
{:date1 "20131007", :data "object2", :counter 50}
{:date1 "20131007", :data "object3", :counter 230}])
(def counters (map :counter data)) ; => (100 50 230)
(def min-value (apply min counters)) ; => 50
(def max-value (apply max counters)) ; => 1000
(def val-range (- max-value min-value)) ; => 950
(def val-pc (* (/ val-range 100) 10)) ; => 95
(def x (- max-value val-pc)) ; => 905
答案 1 :(得分:3)
user=> data
[{:data "object1", :date1 "20131007", :counter 1000} {:data "object2", :date1 "20131007", :counter 50} {:data "object3", :date1 "20131007", :counter 230}]
user=> (apply max-key :counter data)
{:data "object1", :date1 "20131007", :counter 1000}
user=> (apply min-key :counter data)
{:data "object2", :date1 "20131007", :counter 50}