Clojure:按嵌套地图自定义比较器排序

视频

我有一个嵌套的 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何排序地图,而使用具有可比性和比较器接口?如何编写自定义排序?

按自定义订单排序

自定义比较器对多个字段进行排序

如何编写自定义比较器对SortedMap排序?

您如何在Vaadin 8中设置网格以按自定义比较器排序?

Java 8,按属性排序对象列表,无需自定义比较器

错误:使用自定义比较功能排序时出现“无效的比较器”

自定义地图收集器

自定义比较器

在Clojure上使用自定义比较器对原始数组进行排序

php按自定义范围排序

自定义比较器无法正确排序

Clojure:将嵌套地图转换为仅保留特定属性的自定义地图

绝对值排序,使用自定义比较器

使用非标准签名定义自定义地图比较器

Flask-Mongoengine自定义排序比较器

稳定排序自定义比较器,使用按引用传递与lamdas会产生编译错误

朱莉娅:使用自定义比较器按行对矩阵进行排序

如何编写自定义排序器,以在UI中按名称对springdoc swagger标签进行排序?

使用自定义比较功能按多列对熊猫数据框进行排序

使用自定义比较器对ArrayList <String>进行排序

排序嵌套地图Clojure

javascript字符串的自定义排序比较器

自定义排序的嵌套文档

使用比较器按地图值对地图进行排序

自定义按属性排序

如何按自定义字段排序?

地图自定义排序的Groovy列表(按其他列表顺序排序)

使用自定义比较器定义地图,其中值数据结构也具有自定义比较器