Ранжирование элементов в последовательности в clojure - PullRequest
0 голосов
/ 22 мая 2019

У меня есть последовательность элементов вроде ([:Jon 326] [:Mary 233] [:Matthew 255])

и хотел бы умно преобразовать эту последовательность в нечто вроде карты {{:name Jon :rank 1} {:name Matthew :rank 2} {:name Mary :rank 3}}

: имя должно быть строковым типом и: ранжировать целое число

Ранг рассчитывается по количеству, по сравнению с другими элементами в последовательности, чем выше «очки», тем выше ранг

1 Ответ

5 голосов
/ 23 мая 2019

Вы можете использовать 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)})))
...