在Clojure中获取最大值和最小值
我试图将SQL查询的最大和最小结果拉入Clojure,以便对它们执行数学分析,但我不确定为什么会出现错误 我在代码中使用了max和min函数来尝试确定这些结果,尽管我不断收到两个错误,它们似乎与我使用:counter关键字的方式有关 从SQL查询在映射中返回的数据如下所示:在Clojure中获取最大值和最小值,clojure,max,min,Clojure,Max,Min,我试图将SQL查询的最大和最小结果拉入Clojure,以便对它们执行数学分析,但我不确定为什么会出现错误 我在代码中使用了max和min函数来尝试确定这些结果,尽管我不断收到两个错误,它们似乎与我使用:counter关键字的方式有关 从SQL查询在映射中返回的数据如下所示: {:date1 "20131007", :data "object1", :counter 1000} {:date1 "20131007", :data "object2", :counter 50}
{: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
java.lang.ClassCastException: clojure.lang.Keyword cannot be cast to java.lang.Number
如果从代码中删除map函数并再次运行,则会出现以下错误:
java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to java.lang.Number
java.lang.ClassCastException: clojure.lang.Keyword cannot be cast to java.lang.Number
在这方面的任何帮助都是非常感谢的,因为我完全被卡住了(而且我是Clojure的新手,这可能相当令人惊讶)!感谢您对代码所做的一些更改:
- “最小”和“最大”采用数量可变的参数,而不是集合。使用apply to,我们将集合的内容作为参数应用
- Clojure命名约定在单词之间使用-
- 有效的调用必须是一个表单(基本上是第一项可调用的列表)
- 无需使用“关键字”,关键字用于有字符串且需要关联关键字的情况。从地图中拖出数据时,关键字本身充当函数,例如(:a{:a 1:b 2})返回1
- 考虑到前两行中的共性
(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
- “最小”和“最大”采用数量可变的参数,而不是集合。使用apply to,我们将集合的内容作为参数应用
- Clojure命名约定在单词之间使用-
- 有效的调用必须是一个表单(基本上是第一项可调用的列表)
- 无需使用“关键字”,关键字用于有字符串且需要关联关键字的情况。从地图中拖出数据时,关键字本身充当函数,例如(:a{:a 1:b 2})返回1
- 考虑到前两行中的共性
(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
(应用最小值(映射:计数器数据))
或(减少最小值(映射:计数器数据))
。上面的代码和此代码都有效<代码>数据应该是一个映射向量。谢谢,我刚刚尝试了上面的代码,但仍然得到错误:java.lang.ClassCastException:clojure.lang.LazySeq不能转换为java.lang.Number。我只是从:counter键中寻找要返回的实际整数值,以便处理实际值。再次感谢你的帮助!如果只需要值,请使用(应用最小值(映射:计数器数据))
或(减少最小值(映射:计数器数据))
。上面的代码和此代码都有效<代码>数据应该是一个映射向量。关于性能的说明:如果要处理的映射数量较多,使用reduce(类似于(reduce min(:counter(first maps))(map:counter(rest maps)))
)将比apply更有效。关于性能的说明:如果要处理的映射数量较多,请使用reduce(类似于(reduce min(:counter(first map))(map:counter(rest map)))
)的方法将比apply更有效。