Возвращаемое значение самого высокого ключа в 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,

Другие вопросы по тегам