sorting - 按多个键对 Racket 中的结构列表进行排序

标签 sorting struct scheme racket

我有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/

相关文章:

arrays - 根据今天的日期,以一致的顺序随机排列数组 - Swift

perl - 有这种类型的名称吗?

java - 错误的合并排序

c - 为什么匿名结构(非 typedef'd)在 c 语言中有用?

python - 如何在 Python 中将 256 位大端整数转换为小端?

scheme - 创建一个以列表作为参数的过程

方案:API 文档生成器?

Matlab:按行排序

c - 为什么 GCC 在尝试返回结构指针时给我一个语法错误?

scheme - 是否有一种速记方法来更新 Racket 中的特定结构字段?