clojure:如何从地图中获取具有最高价值的一个项目

Dan*_* Wu 1 clojure

我有以下地图.并给出性别参数,需要在没有最多钱的情况下提取用户.怎么做?

{:user1 {:money 400 :sex :male}
:user2 {:money 300 :sex :female}
:user3 {:money 200 :sex :male}
}
Run Code Online (Sandbox Code Playgroud)

Lee*_*Lee 5

你可以使用max-key:

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


Sam*_*tep 5

这是你可以写它的一种方式(感谢@Lee的使用想法max-key!):

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

因此,您首先筛选出不符合您标准的所有用户.对于每个条目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}]
Run Code Online (Sandbox Code Playgroud)