我有一组这样的地图:
#{
{: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}
]
:我该怎么做?
答案 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 %))))