如何在Clojure中将max应用于具有预定义顺序的值列表?

sca*_*age 3 clojure

我需要将max运算符应用于以下列表

[Tier20 Tier10 Tier30]
Run Code Online (Sandbox Code Playgroud)

它应该给我

Tier30
Run Code Online (Sandbox Code Playgroud)

预定义的有序列表(从低到高)是

[Tier5 Tier10 Tier20 Tier30 Tier40 Tier50]
Run Code Online (Sandbox Code Playgroud)

在Clojure中实现这一目标的最佳方法是什么?

Art*_*ldt 6

首先定义排序:

user> (def order '[Tier5 Tier10 Tier20 Tier30 Tier40 Tier50])
#'user/order
Run Code Online (Sandbox Code Playgroud)

然后我们将订单映射到可以通过创建a来排序的东西 map

user> (def order-map (zipmap order (range)))
{Tier50 5, Tier40 4, Tier30 3, Tier20 2, Tier10 1, Tier5 0}
Run Code Online (Sandbox Code Playgroud)

如果您需要的是最大/最小值,请使用order-map减少输入:

user> (reduce #(if (< (order-map %1) (order-map %2)) %1 %2) 
              '[Tier20 Tier10 Tier30])
Tier30
Run Code Online (Sandbox Code Playgroud)


或者如果你需要完整的排序然后使用sort-by函数,它就像常规排序函数,除了它让你有机会在比较之前翻译输入:

user> (sort-by (zipmap order (range)) '[Tier20 Tier10 Tier30])
(Tier10 Tier20 Tier30)
Run Code Online (Sandbox Code Playgroud)

如果你需要经常修改这个地图而不是每次重新排序它然后使用数据sorted-set-by结构来存储你的输入.