将短的懒惰序列破坏为矢量或映射

时间:2016-02-11 01:24:57

标签: clojure clojurescript

假设我有这样的数据结构:

((v v v) (v v v) (v v v) ...)

懒惰序列的懒惰序列。内部的总是计算3个任意值。此结构是在向量上调用partition的结果。

不,我需要将此结构转换为以下内容:

([[v v] v] [[v v] v] [[v v] v] ...)

第一个问题:

这里哪种方法更可取:

(map #(identity [(take 2 %) (last %)]) myseq)

(map (fn [[a b c]] [[a b] c]) myseq)

或。别的什么?

第二个问题:

将它映射到这样的数据结构会不那么有效:

({:k1 [a b] :k2 c} .. )

哪种方式对我的项目有意义。换句话说:与向量相比,创建和访问哈希映射的速度更慢/更快。

2 个答案:

答案 0 :(得分:2)

我可能会使用传感器

 (into {} 
       (comp (partition-all 3) 
             (map (fn [[a b c]] [[a b] c]))) 
       (range 10))
 => {[0 1] 2, [3 4] 5, [6 7] 8, [9 nil] nil}
  

换句话说:与向量相比,是对hashmap的创建和访问速度更慢/更快。

向量不允许(轻松)仅通过键访问值。因此,如果您需要按[a b]进行查找,那么哈希图是您的最佳选择。

答案 1 :(得分:2)

我认为你的第二种解决方案更可取,也很好:)

就个人而言,我会选择表达:

  (for [[a b c] (partition-all 3 xs)]
    {:k1 [a b]
     :k2 c])

小地图与小矢量的效率; Clojure擅长两者!我甚至都不会出汗。选择最具语义意义的选择。以这种方式或其他方式对您的表现产生任何甚至远程显着差异的可能性极小。当然,如果你真的被按下,使用标准的微基准测试将指导你。正如丹尼尔所指出的那样,将如何使用数据将产生巨大影响。