在 Clojure 中对向量的向量进行排序

kdv*_*kdv 2 sorting vector clojure

[[[5 5] [4 4] [8]] [[8 8] [2 2] [3]]]我想按降序对 这个向量的向量(向量的向量)进行排序,所以它变成[[[8 8] [2 2] [3]] [[5 5] [4 4] [8]]]

为了清楚起见,[[[5 5] [4 4] [3]] [[5 5] [4 4] [8]]]将变为 [[[5 5] [4 4] [8]] [[5 5] [4 4] [3]]]

以下不起作用,不知道为什么:

(sort-by > [[[5 5] [4 4] [8]] [[8 8] [2 2] [3]]])
Run Code Online (Sandbox Code Playgroud)

经过多次尝试和研究,我处于同一点,有人可以帮忙吗?

Jam*_*ott 6

你\xe2\x80\x99非常接近,并且你已经注意到sort在Clojure中它足够通用来处理向量。问题是,sort-by使用三个参数不是您想要的,即尝试在排序之前将其用作每个元素上调用的> a key-fn,并且使用>单个参数调用通常会返回true,因此不执行任何排序。

\n

但如果你看一下,(doc sort)你会发现它sort本身有一个三个参数可以满足你的要求:

\n
clojure.core/sort\n([coll] [comp coll])\n  Returns a sorted sequence of the items in coll. If no comparator is\n  supplied, uses compare.  comparator must implement\n  java.util.Comparator.  Guaranteed to be stable: equal elements will\n  not be reordered.  If coll is a Java array, it will be modified.  To\n  avoid this, sort a copy of the array.\n
Run Code Online (Sandbox Code Playgroud)\n

不过,尝试使用>作为我们的比较并不有效,因为>处理的是数字,而不是向量:

\n
(sort > [[[5 5] [4 4] [3]] [[5 5] [4 4] [8]]])\nExecution error (ClassCastException) at java.util.TimSort/countRunAndMakeAscending (TimSort.java:355).\nclass clojure.lang.PersistentVector cannot be cast to class java.lang.Number (clojure.lang.PersistentVector is in unnamed module of loader 'app'; java.lang.Number is in module java.base of loader 'bootstrap')\n
Run Code Online (Sandbox Code Playgroud)\n

但我们可以使用compare您的问题评论中提到的功能来sort实现您的目标。comparesort通常使用的,它可以处理向量,但它的排序顺序错误,所以我们想交换我们正在比较的元素的顺序:

\n
(sort #(compare %2 %1) [[[5 5] [4 4] [3]] [[5 5] [4 4] [8]]])\n([[5 5] [4 4] [8]] [[5 5] [4 4] [3]])\n
Run Code Online (Sandbox Code Playgroud)\n