在Clojure中排序列表

use*_*652 6 sorting clojure

我试图以特定的方式对Clojure列表(或seq,如果它是所谓的)进行排序.我希望它按降序排列最后一项的优先级,然后按升序排列第一项.一个例子:

(def pnts '((1 2)
            (2 4)
            (3 2)
            (4 10)
            (5 3)
            (6 1)
            (7 2)))

(sort-by last > pnts)
;; ((4 10) (2 4) (5 3) (1 2) (3 2) (7 2) (6 1))
;; Notice how (1 2), (3 2), (7 2) are sorted. This
;; is correct and is what I want.
Run Code Online (Sandbox Code Playgroud)

(排序由过去的),似乎是在做的伎俩,虽然这可能是因为点最初由排序第一个项目.我正在实现我正在编写点的ASCII/CLI图形脚本的方式将始终像pnts那样排序.我的问题是什么是可以保证这种排序偏好的命令?

PS我尝试过(排序方式(juxt last first)(juxt> <)pnts)但无济于事.

Dao*_*Wen 8

我认为你在正确的轨道上使用juxt.假设您的点数都是数字,您可以在最后一个组件上撰写last-模拟降序自然顺序.

user=> (sort-by (juxt (comp - last) first) (shuffle pnts))
((4 10) (2 4) (5 3) (1 2) (3 2) (7 2) (6 1))
Run Code Online (Sandbox Code Playgroud)


A. *_*ebb 5

Sort使用Java的排序,这是稳定的,所以你也可以只排序两次

 (def pnts (shuffle '((1 2) (2 4) (3 2) (4 10) (5 3) (6 1) (7 2))))

 (->> pnts (sort-by first <) (sort-by last >))
 ;=> ((4 10) (2 4) (5 3) (1 2) (3 2) (7 2) (6 1))
Run Code Online (Sandbox Code Playgroud)