Clojure - 以散列数组

时间:2016-08-30 12:32:05

标签: clojure

我想更新哈希值,但我不确定如何有效地完成这项工作

我尝试使用循环方法,但同时保留之前记录的值似乎是一个很大的挑战。

这就是我想要做的,

考虑到记录是按降序排列的created_at排序的,例如,

[{:id 1, :created_at "2016-08-30 11:07:00"}{:id 2, :created_at "2016-08-30 11:05:00"}...]

]     ;基本上是人性化的形式。

有人可以分享一些想法来实现这一目标吗?提前致谢。

2 个答案:

答案 0 :(得分:1)

简化示例:

(def data [{:value 10} {:value 8} {:value 3}])

(conj
 (mapv
  (fn [[m1 m2]] (assoc m1 :difference (- (:value m1) (:value m2))))
  (partition 2 1 data))
 (last data))

;;=> [{:value 10, :difference 2} {:value 8, :difference 5} {:value 3}]

答案 1 :(得分:0)

你需要的是迭代所有连续记录对,保留它们中的第一个,增加差异。

日期处理的第一个实用函数:

(defn parse-date [date-str]
  (.parse (java.text.SimpleDateFormat. "yyyy-MM-dd HH:mm:ss") date-str))

(defn dates-diff [date-str1 date-str2]
  (- (.getTime (parse-date date-str1))
     (.getTime (parse-date date-str2))))

然后是映射部分:

user> (def data [{:id 1, :created_at "2016-08-30 11:07:00"}
                 {:id 2, :created_at "2016-08-30 11:05:00"}
                 {:id 3, :created_at "2016-08-30 10:25:00"}])

user> (map (fn [[rec1 rec2]]
             (assoc rec1 :difference
                    (dates-diff (:created_at rec1)
                                (:created_at rec2))))
           (partition 2 1 data))
({:id 1, :created_at "2016-08-30 11:07:00", :difference 120000}
 {:id2, :created_at "2016-08-30 11:05:00", :difference 2400000})

注意它不包含最后一项,因为它从不是一对中的第一项。所以你必须手动添加它:

user> (conj (mapv (fn [[rec1 rec2]]
                    (assoc rec1 :difference
                           (dates-diff (:created_at rec1)
                                       (:created_at rec2))))
                  (partition 2 1 data))
            (assoc (last data) :difference ""))
[{:id 1, :created_at "2016-08-30 11:07:00", :difference 120000} 
 {:id 2, :created_at "2016-08-30 11:05:00", :difference 2400000} 
 {:id 3, :created_at "2016-08-30 10:25:00", :difference ""}]

现在没关系。与您想要的变体的唯一区别在于差异是以毫秒为单位,而不是格式化的字符串。为此,您可以将格式添加到dates-diff功能。