【问题标题】:Rank elements in a sequence in clojure在clojure中对序列中的元素进行排名
【发布时间】:2019-05-22 20:55:54
【问题描述】:

我对像这样的元素有一个序列 ([:Jon 326] [:Mary 233] [:Matthew 255])

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

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

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

【问题讨论】:

  • 您的结果映射多次包含 :rank 键 - 您是否想要一系列映射,例如({:name Jon :rank 1} {:name Matthew :rank 2} {:name Mary :rank 3})?您希望 :name 值是符号吗? :rank 值是如何计算的?
  • 写map的时候出错了,一​​定是map的序列。 :name 键应该是一个字符串, :rank os 是从序列中的数字计算出来的,例如。 ([:Jon 255][:Mary 150]) Jon 排名 1 而 Mary 排名 2 因为 Jon 有 255 分而 Mary 有 150 分
  • @br-baker-01 你应该编辑问题。
  • @AmanuelNega 感谢您帮助编辑问题以进行澄清

标签: clojure sequence seq


【解决方案1】:

您可以使用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)})))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    相关资源
    最近更新 更多