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
相关产品推荐
相关产品推荐

