Возвращаемое значение самого высокого ключа в Clojure
Я работаю с этими двумя группами пар ключ-значение, которые возвращаются другой функцией. Я хотел бы написать функцию, которая всегда найдет самый высокий ключ и вернет его соответствующее значение. В этом примере я бы вернул 2, потому что 499 - самый высокий ключ. Данные, с которыми я работаю
({-99 0, 99 0} {-99 2, 499 2})
Когда я звоню
(type ({-99 0, 99 0} {-99 2, 499 2}))
В функции, которая отвечает за возвращение этих данных, я получаю обратно
(clojure.lang.PersistentTreeMap clojure.lang.PersistentTreeMap)
Надеюсь, это поможет. Спасибо!
5 ответов
Эта функция вернет самую правую запись отсортированной карты Clojure (встроенная реализация называется clojure.lang.PersistentTreeMap
) в логарифмическом времени:
(defn rightmost
"Takes a Clojure sorted map sm and returns the entry at the greatest
key (as determined by sm's comparator)."
[sm]
(first (rseq sm)))
Пример:
(rightmost (sorted-map 1 1 2 2 3 3))
;= [3 3]
Затем вы можете вывести значение, используя val
функция.
Все max-key
/ apply max
решения на основе работают вместо линейного времени. Излишне говорить, что это огромная разница.
Если другую функцию можно убедить вернуть карты data.avl, вы можете получить доступ к элементу в любом индексе в логарифмическом времени, используя nth
:
;; works for data.avl sorted maps, not the built-ins
(nth (avl/sorted-map 1 1 2 2 3 3) 2)
;= [3 3]
(as-> (apply merge pair)
merged
(->> merged
keys
(apply max)
merged))
Обратите внимание, что когда обе карты имеют "самый высокий" ключ, возвращается значение второй.
Это хороший пример использования max-key
(См. Этот другой вопрос SO для хорошего примера его использования), который, я думаю, имеет своего рода вводящее в заблуждение название - на самом деле он принимает функцию и коллекцию и возвращает элемент в коллекции, которая имеет самый высокий результат применения функции к этому элементу. Вы можете использовать функцию key
, который возвращает ключ пары ключ-значение.
(Обратите внимание, что вам нужно объединить свои карты вместе, чтобы вы работали с одной коллекцией пар ключ-значение.)
(apply max-key key (concat {-99 0, 99 0} {-99 2, 499 2}))
;=> [499 2]
(second *1)
;=> 2
(defn val-for-max-key [maps]
(->> (map (partial apply max-key key) maps)
(apply max-key key)
val))
РЕДАКТИРОВАТЬ: неправильно понял желаемое возвращаемое значение
({-99 0, 99 0} {-99 2, 499 2})
это операция поиска, где {-99 0, 99 0}
это словарь и {-99 2, 499 2}
это ключ. Поскольку последнее не является ключом в первом, выражение вернет ноль.
Когда я оцениваю (type ({-99 0, 99 0} {-99 2, 499 2}))
, Я получил nil
, потому что тип nil
это также nil
,