Сортировка списка по машине каждого элемента в Racket - PullRequest
0 голосов
/ 04 мая 2018

Я хочу отсортировать список по автомобилю каждого элемента, который является конс-ячейкой. Автомобиль каждого элемента - это число, а часть 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 голосов
/ 05 мая 2018

Комментарий Алексиса работает в #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?))
...