Clojure集合/项目不维护秩序。该怎么办? Clojure中

问题描述:

集/项目没有维持秩序可以看出:Clojure集合/项目不维护秩序。该怎么办? Clojure中

(project (map #(hash-map :number % :square (* % %)) (range 100)) #{:square}) 

有没有使用它,而维持秩序的习惯的方法或我将不得不明确添加序号和他们算账排序?

clojure.set/project来源:

(defn project 
    "Returns a rel of the elements of xrel with only the keys in ks" 
    {:added "1.0"} 
    [xrel ks] 
    (set (map #(select-keys % ks) xrel))) 

你需要实现自己的project无需转换结果为set

(defn my-project [xrel ks] 
    (map #(select-keys % ks) xrel)) 

测试:

(my-project (map #(hash-map :number % :square %) 
       (range 100)) 
      #{:square}) 
=> ({:square 0} 
    {:square 1} 
    {:square 2} 
    {:square 3} 
    ... 
    {:square 99}) 

更新。另一个版本:

(defn my-project2 [xrel ks] 
    (map (fn [m] (into {} (filter #(ks (key %)) m))) 
     xrel)) 
+0

..这引出了一个问题:在库中使用set有什么好处?对我来说,由于相同的键仅被表示一次,所以投影的结果可能具有不同的计数。 –

+0

@MarcusJuniusBrutus直到你问起,我才看过这个函数。我只能假设它是因为'project'是'clojure.set'的一部分,它被设计用来处理sets(?)。 – mobyte

+0

'clojure.set'的目的是作为一个轻量级的实现关系代数与代表关系的地图集合一起工作。请参阅[本博客文章](http://www.lshift.net/blog/2010/08/21/some-relational-algebra-with-datatypes-in-clojure-12)以获取概述。 '项目'旨在与'join','select'等配合使用。 –