我试图以特定的方式对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)但无济于事.
我认为你在正确的轨道上使用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)
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)