2011-03-22 23 views
17

我有一組地圖是這樣的:如何排列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:

[ 
    {: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} 
] 

:我該怎麼辦這個?

回答

31

功能sort-by是你在找什麼:

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

簡單,精確,簡潔。工作就像一個魅力@Leonel – William 2015-08-10 13:53:36

7

排序是一個很好的答案,它使代碼在它工作的簡單情況下變得更好。此外,排序功能可以從每個地圖提取一個函數來提取比較關鍵字,因此您需要對每個項目進行一些處理。在這個例子中,我使用了一個排序函數來提取每個名字,然後對它們進行字符串比較。

(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(的),因爲它正確處理零和Clojure的集合正確進行比較。基本上是使用的捷徑。 opperator在大多數情況下

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

我不明白,你能解釋一下,請問這是怎麼回事? – Zubair 2011-03-22 17:44:19

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"})

4

sort-by是你想要的,但請發佈實際上是有效代碼的片段;我浪費了相當一段時間,試圖找出一個問題,因爲#{{:name "a" :value "b"} {:name "a" :value "b"}}使讀者barf。

+0

「更多的東西在這裏」將防止重複鍵錯誤。 – 2011-03-23 00:17:02

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 %))))