我有一个嵌套的 Clojure 地图:
{
:1 {
:priority "Medicore"
:somekey "SomeValue"
},
:2 {
:priority "Enormous"
:somekey "SomeValue"
},
:3 {
:priority "Weeny"
:somekey "SomeValue"
}
}
我的目标是以somekey
“最高”优先级从地图中获取 的价值。外部映射可以包含 0-n 个具有三个优先级中的任何一个的元素。如果有多个具有最高可用优先级的条目,我可以选择任何一个。
在研究了其他一些 SO 问题之后,我认为解决这个问题的一个好方法是使用该sort-by
函数。但由于我priority
不是自然排序的,我必须提供一些自定义比较器。
这可能吗?我的方法甚至适合我的目标吗?
为了使用,sort-by
您需要提供排序或您的优先级值。您可以实现一个自定义比较器来比较您的地图或定义一个 keyfn 来sort-by
计算用于排序的键。使用 keyfn 的解决方案如下。仅使用 keyfn 返回符合您要求的可比较值比实现比较器容易得多。您可能需要查看比较器指南。
我们开始定义一个函数来将字符串优先级转换为其数字表示:
(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
现在我们需要计算每个地图的最大优先级:
(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
现在我们终于可以使用sort-by
:
(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"}})
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句