2013-05-23 16 views
8

Jeśli mam kolejność zapisów określonych (defrecord Person [name age]) i chcę dostać rekord osoby z maksymalnym wiekiem, czy istnieje prostszy sposób to zrobić niżjak zrobić max-by w clojure?

(reduce #(if (> (:age %1) (:age %2)) %1 %2) people) 

To jedyny sposób, w jaki Do tej pory udało się to zrobić, ale wydaje się, że to dość częsty scenariusz, że muszą istnieć wbudowane funkcje biblioteczne, które ułatwiają i/lub generują.

Odpowiedz

12

clojure.core/max-key to odpowiednie narzędzie do pracy.

(apply max-key :age [{:age 12} {:age 20} {:age 30}]) ;; -> {:age 30} 
+0

'max-key' robi to samo' reduce' rzeczy, jak pokazano na pytanie :) – Ankur

+0

Tak :) Zastanawiam się, gdyby to było dobre pomysł, aby użyć 'porównać' zamiast'> '? tzn. 'max-key' może działać z dowolnymi wartościami zamiast tylko liczbowymi (jak opisano w dokumencie). – vemv

0
(last (sort-by :age [{:age 12} {:age 20} {:age 30}])) 

zastosowania sort-by porównać

+0

Powoduje niepotrzebne dodanie współczynnika log (n) do złożoności czasu. –