You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Clojure中嵌套向量降序排序求助:sort-by为何无法生效?

解决Clojure嵌套向量的降序排序问题

你的问题出在对sort-by函数的用法理解有误:sort-by的第一个参数是键提取函数(用来从每个元素中提取排序依据的键),而不是比较器。你传入>作为第一个参数,这会导致函数行为异常,因为>需要多个参数才能正常工作。

要实现你需要的嵌套向量顶层元素降序排序,有两种简洁的正确写法:

方法1:使用sort搭配反转比较器

Clojure的sort函数可以接受一个自定义比较器,默认使用compare函数实现升序排序。要实现降序,只需将比较的两个元素顺序反转:

;; 第一个示例
(sort #(compare %2 %1) [[[5 5] [4 4] [8]] [[8 8] [2 2] [3]]])
;; 输出: [[[8 8] [2 2] [3]] [[5 5] [4 4] [8]]]

;; 第二个示例
(sort #(compare %2 %1) [[[5 5] [4 4] [3]] [[5 5] [4 4] [8]]])
;; 输出: [[[5 5] [4 4] [8]] [[5 5] [4 4] [3]]]

这里的#(compare %2 %1)会先比较第二个参数和第一个参数,从而反转默认的升序逻辑,得到降序结果。Clojure对向量的比较是逐元素依次对比的,完全符合你示例中的排序需求:先比顶层向量的第一个子元素,再比第二个,以此类推。

方法2:使用sort-by搭配identity键函数

如果一定要用sort-by,可以用identity作为键提取函数(直接以元素本身作为排序键),再传入同样的反转比较器:

(sort-by identity #(compare %2 %1) [[[5 5] [4 4] [8]] [[8 8] [2 2] [3]]])

这个写法和方法1的效果完全一致,只是更明确地指定了排序键为元素本身。

内容的提问来源于stack exchange,提问作者kdv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 22:35:24