我有list-of-cars
,这是一个car
类型的结构列表,其中包含“制造商”、“型号”和“年份”字段。使用常规的 Racket sort
功能,我可以按一键排序(例如“maker”)。但是,如何按制造商和型号进行排序,并得出与示例中的 sort-by-maker-and-model
输出相同的列表?
这不是学校作业,我试图用比我需要处理的实际数据更简单的数据来制作一个清晰的例子。昂贵的汽车对我来说似乎并不太无聊。
享受我巧妙的例子吧!祝你有美好的一天!
#lang racket/base
(define-struct car (maker model year) #:transparent)
(define list-of-cars (list (car "Ferrari" "250 Europa GT" "1954")
(car "Bugatti" "Type 2" "1900")
(car "Lamborghini" "Flying Star II" "1966")
(car "Bugatti" "Type 10" "1908")
(car "Ferrari" "166 Inter" "1949")
(car "Bugatti" "Type 5" "1903")
(car "Maserati" "A6 1500" "1946")
(car "Ferrari" "340 America" "1951")
(car "Maserati" "5000 GT" "1959")
(car "Maserati" "Quattroporte" "1963")
(car "Lamborghini" "Egoista" "2013")))
(define (sort-by-maker lst)
(sort lst
string<?
#:key car-maker))
(sort-by-maker list-of-cars)
; =>
(list
(car "Bugatti" "Type 2" "1900")
(car "Bugatti" "Type 10" "1908")
(car "Bugatti" "Type 5" "1903")
(car "Ferrari" "250 Europa GT" "1954")
(car "Ferrari" "166 Inter" "1949")
(car "Ferrari" "340 America" "1951")
(car "Lamborghini" "Flying Star II" "1966")
(car "Lamborghini" "Egoista" "2013")
(car "Maserati" "A6 1500" "1946")
(car "Maserati" "5000 GT" "1959")
(car "Maserati" "Quattroporte" "1963"))
(define (sort-by-maker-and-model lst)
; ???
#f)
(sort-by-maker-and-model list-of-cars)
; =>
(list
(car "Bugatti" "Type 2" "1900")
(car "Bugatti" "Type 5" "1903")
(car "Bugatti" "Type 10" "1908")
(car "Ferrari" "166 Inter" "1949")
(car "Ferrari" "250 Europa GT" "1954")
(car "Ferrari" "340 America" "1951")
(car "Lamborghini" "Egoista" "2013")
(car "Lamborghini" "Flying Star II" "1966")
(car "Maserati" "5000 GT" "1959")
(car "Maserati" "A6 1500" "1946")
(car "Maserati" "Quattroporte" "1963"))
最佳答案
您需要创建自己的小于?
比较函数:
(define (sort-by-maker-and-model lst)
(sort lst
(lambda (e1 e2)
(or (string<? (car-maker e1) (car-maker e2))
(and (string=? (car-maker e1) (car-maker e2))
(string<? (car-model e1) (car-model e2)))))))
或者,您可以只创建一个连接两个字段的key
过程:
(define (sort-by-maker-and-model lst)
(sort lst
string<?
#:key (lambda (e) (string-append (car-maker e) " " (car-model e)))))
这应该在这里有效,但前者是更通用的方法。任何方式:
> (sort-by-maker-and-model list-of-cars)
(list
(car "Bugatti" "Type 10" "1908")
(car "Bugatti" "Type 2" "1900")
(car "Bugatti" "Type 5" "1903")
(car "Ferrari" "166 Inter" "1949")
(car "Ferrari" "250 Europa GT" "1954")
(car "Ferrari" "340 America" "1951")
(car "Lamborghini" "Egoista" "2013")
(car "Lamborghini" "Flying Star II" "1966")
(car "Maserati" "5000 GT" "1959")
(car "Maserati" "A6 1500" "1946")
(car "Maserati" "Quattroporte" "1963"))
关于sorting - 按多个键对 Racket 中的结构列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33649156/