首页 > 解决方案 > 在clojure中对序列中的元素进行排名

问题描述

我有一个关于元素的序列 ([:Jon 326] [:Mary 233] [:Matthew 255])

并想以一种巧妙的方式将这个序列转换成类似于地图的东西 {{:name Jon :rank 1} {:name Matthew :rank 2} {:name Mary :rank 3}}

:name 应该是一个字符串类型和 :rank 一个整数

排名由数字计算,与序列中元素中的其他元素相比,“点”越高,排名越高

标签: clojuresequenceseq

解决方案


您可以使用sort-by对输入序列进行排序,然后使用map-indexed将其转换为等级:

(def input '([:Jon 326] [:Mary 233] [:Matthew 255]))

(map-indexed (fn [idx p]
               {:name (name (first p))
                :rank (inc idx)})
             (sort-by second > input))

或者您可以使用最后线程宏:

 (->> input 
      (sort-by second >) 
      (map-indexed (fn [idx p] {:name (name (first p)) :rank (inc idx)})))

您还可以将函数中的对解构为map-indexed而不是使用first

(->> input 
     (sort-by second >) 
     (map-indexed (fn [idx [n _]] {:name (name n) :rank (inc idx)})))

推荐阅读