如何对一组clojure地图进行排序?

时间:2011-03-22 17:36:37

标签: clojure

我有一组这样的地图:

#{
  {:name "a" :value "b" ... more stuff here}
  {:name "b" :value "b" ... more stuff here}
  {:name "b" :value "b" ... more stuff here}
  {:name "a" :value "b" ... more stuff here}
  {:name "c" :value "b" ... more stuff here}
  {:name "a" :value "b" ... more stuff here}
}

:我想要一个有序列表,就像sql order-by name:

[
  {:name "a" :value "b" ... more stuff here}
  {:name "a" :value "b" ... more stuff here}
  {:name "a" :value "b" ... more stuff here}
  {:name "b" :value "b" ... more stuff here}
  {:name "b" :value "b" ... more stuff here}
  {:name "c" :value "b" ... more stuff here}
]

:我该怎么做?

5 个答案:

答案 0 :(得分:31)

功能sort-by正是您所需要的:

(def s
  #{
    {:name "d" :value "b" }
    {:name "b" :value "b" }
    {:name "c" :value "b" }
    })
(sort-by :name s)

答案 1 :(得分:7)

sort-by是一个很好的答案,并且在它工作的简单情况下使代码更好。此外,排序功能可以采用一种功能从每个地图中提取同伴密钥,因为您需要对每个项目进行一些处理。在这个例子中,我使用一个sort函数来提取每个名称,然后对它们进行字符串比较。

(sort #(compare (:name %1) (:name %2)) data)
=>  ({:name "a", :value "b"} {:name "b", :value "b"} {:name "c", :value "b"})

如果您的馆藏有不同的名称可供比较,这很有用:

(sort #(compare (:value %1) (:name %2)) data)
=> ({:name "a", :value "b"} {:name "c", :value "b"} {:name "b", :value "b"})

compare函数是java的.compareto()的更好版本,因为它正确处理nil并正确地比较了clojure集合。基本上是使用的捷径。在大多数情况下,opperator

(sort #(. (:name %1) (compareTo (:name %2))) data)
=> ({:name "a", :value "b"} {:name "b", :value "b"} {:name "c", :value "b"})

答案 2 :(得分:5)

(def set-of-maps #{{:name "d"}, {:name "b"}, {:name "a"}})

- > clojure.core/sort-by

(sort-by :name set-of-maps)

; => ({:name "a", :value "b"} {:name "c", :value "b"} {:name "d", :value "b"})

答案 3 :(得分:4)

sort-by是您想要的,但请发布实际有效代码的片段;我浪费了相当多的时间试图找出一个问题,因为#{{:name "a" :value "b"} {:name "a" :value "b"}}会让读者成为一个倒钩。

答案 4 :(得分:2)

我相信来自clojure的快乐的片段是最好的。

(def plays [{:band "Burial",     :plays 979,  :loved 9}
           {:band "Eno",        :plays 2333, :loved 15}
           {:band "Bill Evans", :plays 979,  :loved 9}
           {:band "Magma",      :plays 2665, :loved 31}])

(def sort-by-loved-ratio (partial sort-by #(/ (:plays %) (:loved %))))