Um sort-by
zu verwenden, müssen Sie eine Bestellung oder Ihre Prioritätswerte angeben. Sie können einen benutzerdefinierten Komparator implementieren, um Ihre Maps zu vergleichen, oder einen Keyfn für sort-by
definieren, der den für die Sortierung verwendeten Schlüssel berechnet. Die Lösung mit Keyfn ist unten. Mit nur dem Keyfn-Rückgabewert ist ein vergleichbarer Wert, der Ihren Anforderungen entspricht, wesentlich einfacher als die Implementierung eines Vergleichers. Vielleicht möchten Sie einen Blick auf Comparators Guide werfen.
Wir beginnen, die eine Funktion eine Zeichenfolge Priorität in seine numerische Darstellung zu konvertieren:
(let [priorities {"Medicore" 0
"Enormous" 1
"Weeny" 2}]
(defn priority->num [p]
(if-let [num (priorities p)]
num
(throw (IllegalArgumentException. (str "Unknown priority: " p))))))
(priority->num "Enormous")
;; => 1
Jetzt müssen wir für jede Karte max Priorität berechnen:
(defn max-priority-num [m]
(->> m
(vals)
(map (comp priority->num :priority))
(apply max)))
(max-priority-num {:1 {:priority "Medicore" :somekey "SomeValue"}
:2 {:priority "Enormous" :somekey "SomeValue"}
:3 {:priority "Weeny" :somekey "SomeValue"}})
;; => 2
Jetzt können wir endlich sort-by
verwenden :
(def m1 {:1 {:priority "Medicore" :somekey "SomeValue"}
:2 {:priority "Medicore" :somekey "SomeValue"}
:3 {:priority "Weeny" :somekey "SomeValue"}})
(def m2 {:1 {:priority "Medicore" :somekey "SomeValue"}
:2 {:priority "Enormous" :somekey "SomeValue"}
:3 {:priority "Weeny" :somekey "SomeValue"}})
(def m3 {:1 {:priority "Medicore" :somekey "SomeValue"}
:2 {:priority "Medicore" :somekey "SomeValue"}
:3 {:priority "Medicore" :somekey "SomeValue"}})
(sort-by max-priority-num [m1 m2 m3])
;; =>
({:1 {:priority "Medicore", :somekey "SomeValue"},
:2 {:priority "Medicore", :somekey "SomeValue"},
:3 {:priority "Medicore", :somekey "SomeValue"}}
{:1 {:priority "Medicore", :somekey "SomeValue"},
:2 {:priority "Medicore", :somekey "SomeValue"},
:3 {:priority "Weeny", :somekey "SomeValue"}}
{:1 {:priority "Medicore", :somekey "SomeValue"},
:2 {:priority "Enormous", :somekey "SomeValue"},
:3 {:priority "Weeny", :somekey "SomeValue"}})
Dies ist viel einfacher mit 'max-key' als' sort-by'. – amalloy
Right @amalloy, ich habe übersehen OP wollte das maximale Element, nicht alle Elemente sortiert bekommen! Anstatt also '(sort-by max-priority-num [m2 m2 m3])', '(max-key max-priority-num m1 m2 m3)' oder '(max-key max-priority-num maps) zu benennen) 'wäre besser. –