2016-03-03 35 views
1

我有以下地圖。並給出一個性別的參數,需要爲那個性別沒有最多錢的用戶。怎麼做?clojure:如何從地圖中選取具有最高價值的物品

{:user1 {:money 400 :sex :male} 
:user2 {:money 300 :sex :female} 
:user3 {:money 200 :sex :male} 
} 
+0

https://clojuredocs.org/clojure.core/reduce –

+0

你需要讓用戶無需* *最多的錢對於一個給定的性別,或與* *最賺錢對於給定的性別? –

回答

5

這裏,你可以把它寫一個方法(感謝@Lee使用max-key的想法!):

(defn richest [sex users] 
    (apply max-key (comp :money val) (filter (comp #{sex} :sex val) users))) 

所以,你首先過濾掉所有不符合標準的用戶。對於users中的每個條目,您將獲得該條目的val,然後在該條目下獲得:sex的值,然後檢查該結果是否包含在包含sex的單元素集中。

然後,一旦你篩選掉了你不想要的用戶,就可以查看結果序列的條目。對於每個條目,您再次獲得該條目的val,然後在該條目下得到:money的值,最後返回給出該查詢的最高結果的條目。

例子:

(def users {:user1 {:money 400 :sex :male} 
      :user2 {:money 300 :sex :female} 
      :user3 {:money 200 :sex :male}}) 

(richest :male users) 
;=> [:user1 {:money 400, :sex :male}] 

(richest :female users) 
;=> [:user2 {:money 300, :sex :female}] 
5

您可以使用max-key

(defn richest-by-sex [users s] 
    (apply max-key (comp :money second) (filter (fn [[n v]] (= s (:sex v))) users)))