Сортировка списка по машине каждого элемента в Racket

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

person user9736725    schedule 04.05.2018    source источник
comment
если бы вы определили (insert-by-car-number ...), то вы могли бы для каждого элемента в list1 вставить этот элемент по машине в новый список, который таким образом был бы построен в отсортированном порядке, как (set! new-list (insert-by-car-number element new-list)). если вы начнете с пустого new-list, он будет упорядочен на каждом этапе по построению. когда в list1 больше нет элементов, new-list является его отсортированной версией. это известно как сортировка вставками.   -  person Will Ness    schedule 05.05.2018
comment
Спасибо. Предложение кода от вас обоих было очень полезным.   -  person user9736725    schedule 05.05.2018


Ответы (1)


Комментарий 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?))
person Sylwester    schedule 05.05.2018