Dictionary 给定Clojure中的一系列映射,如何筛选键的值>;(一些价值)?
我有一系列Clojure地图,看起来像这样:Dictionary 给定Clojure中的一系列映射,如何筛选键的值>;(一些价值)?,dictionary,filter,clojure,sequence,Dictionary,Filter,Clojure,Sequence,我有一系列Clojure地图,看起来像这样: ({:date "2000-01-01" :value 123} {:date "2000-01-02" :value 487} ... {:date "2014-05-01" :value 17}) 我想构建一个函数,它将返回一个结构类似的映射序列,但只包含那些日期值介于“2005-11-14”和“2007-08-03”之间的映射 在其当前的YYYY-MM-DD格式中,日期是可比较的,因此(比较“2000-01-02”“2001-03
({:date "2000-01-01" :value 123}
{:date "2000-01-02" :value 487}
...
{:date "2014-05-01" :value 17})
我想构建一个函数,它将返回一个结构类似的映射序列,但只包含那些日期值介于“2005-11-14”和“2007-08-03”之间的映射
在其当前的YYYY-MM-DD格式中,日期是可比较的,因此(比较“2000-01-02”“2001-03-04”)
的效果与预期一致。但是,我无法解决如何从序列中提取:date值并进行比较
我已经完成了
(筛选(>0(比较(:日期%))“2099-12-09”)数据)
,但无法获得更多。救命啊 在Clojure中,向量、集合和映射等数据结构可以用作函数。
这意味着如果x
是一个映射,则可以通过类似(x:date)
的方式获取值。
因此,下面的代码将完成这项工作
(def data '({:date "2005-11-13", :value 0}
{:date "2005-11-15", :value 1}
{:date "2007-08-02", :value 2}
{:date "2007-08-04", :value 3}))
(print (filter
#(and
(> (compare (% :date) "2005-11-14") 0)
(< (compare (% :date) "2007-08-03") 0))
data))
编辑:
下面的代码稍微好一点,因为它每次迭代都会从map中获取一次日期
(print (filter
#(let [x (% :date)]
(and
(> (compare x "2005-11-14") 0)
(< (compare x "2007-08-03") 0)))
data))
(打印(过滤器
#(让[x(%:日期)]
(及
(>(比较x“2005-11-14”)0)
(<(比较x“2007-08-03”)0)
(数据)
谢谢你,蒙纳德-你知道,我在实验中差点就成功了!您的代码工作完美,非常容易理解;现在我只需要自己学会用这种方式编写代码
(print (filter
#(let [x (% :date)]
(and
(> (compare x "2005-11-14") 0)
(< (compare x "2007-08-03") 0)))
data))