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)
经过多次尝试和研究,我处于同一点,有人可以帮忙吗?
你\xe2\x80\x99非常接近,并且你已经注意到sort在Clojure中它足够通用来处理向量。问题是,sort-by使用三个参数不是您想要的,即尝试在排序之前将其用作每个元素上调用的> a key-fn,并且使用>单个参数调用通常会返回true,因此不执行任何排序。
但如果你看一下,(doc sort)你会发现它sort本身有一个三个参数可以满足你的要求:
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.\nRun Code Online (Sandbox Code Playgroud)\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')\nRun Code Online (Sandbox Code Playgroud)\n但我们可以使用compare您的问题评论中提到的功能来sort实现您的目标。compare是sort通常使用的,它可以处理向量,但它的排序顺序错误,所以我们想交换我们正在比较的元素的顺序:
(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]])\nRun Code Online (Sandbox Code Playgroud)\n