按照Racket中每个元素的汽车排序列表

时间:2018-05-04 19:57:04

标签: sorting racket cons

我想通过每个元素的汽车对列表进行排序,这是一个缺点单元格。每个元素的汽车是一个数字,而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))

1 个答案:

答案 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?))