我想通过每个元素的汽车对列表进行排序,这是一个缺点单元格。每个元素的汽车是一个数字,而cdr部分是一个单词。我可以得到一个刚刚排序的数字列表。我尝试使用这个已排序的数字列表来排序我的原始列表。但我真的不知道该怎么做。
这是我的代码:
(define (sort-by-car-number lst) ;lst is a list with cons-pair
(let ((number-list (sort (map car lst) >))) ;A list of sorted numbers
(cond
((null? lst) number-list)
((equal? (car number-list) (car (car lst)))
(set! (car number-list) (car lst))))
(else (sort-by-car-number (cdr lst))))))
我希望输出如下:
(sort-by-car-number (list '(4 . Blue) '(8 . Black) '(0 . Yellow) '(3 . Green)))
; ==> ((8 . Black) (4 . Blue) (3 . Green) (0 . Yellow))
答案 0 :(得分:0)
Alexis评论在#lang racket
中有效,但OP需要降序排列:
(define (sort-by-car-number lst)
(sort lst >= #:key car))
(sort-by-car-number '((4 . Blue) (8 . Black) (0 . Yellow) (3 . Green)))
; ==> ((8 . Black) (4 . Blue) (3 . Green) (0 . Yellow))
对于不使用#:key
的更标准的方案,将会发生的每个元素与(>= '(4 . Blue) '(8 . Black))
进行比较,所以如果您通过比较函数执行此操作,那么一般方案解决方案:
(define (sort-by-car-number lst)
(define (object-greater? a b)
(>= (car a) (car b)))
(sort lst object-greater?))