Vas*_*ily 4 sorting scheme struct racket
我有一个包含字段“maker”、“model”和“year”list-of-cars的类型结构列表。car使用常规的 Racketsort功能,我可以按一键排序(例如“制造商”)。但是我怎样才能按制造商和型号排序并得出与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"))
Run Code Online (Sandbox Code Playgroud)
您需要创建自己的less-than?比较函数:
(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)))))))
Run Code Online (Sandbox Code Playgroud)
或者,您可以创建一个key连接两个字段的过程:
(define (sort-by-maker-and-model lst)
(sort lst
string<?
#:key (lambda (e) (string-append (car-maker e) " " (car-model e)))))
Run Code Online (Sandbox Code Playgroud)
这在这里应该可行,但前者是更通用的方法。反正:
> (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"))
Run Code Online (Sandbox Code Playgroud)