Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Clojure中获取最大值和最小值_Clojure_Max_Min - Fatal编程技术网

在Clojure中获取最大值和最小值

在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}

我试图将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
    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键中寻找要返回的实际整数值,以便处理实际值。再次感谢你的帮助!如果只需要值,请使用
(应用最小值(映射:计数器数据))
(减少最小值(映射:计数器数据))
。上面的代码和此代码都有效<代码>数据应该是一个映射向量。谢谢,我刚刚尝试了上面的代码,但仍然得到错误: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更有效。