Scheme - 对列表的列表进行排序

Scheme - Sorting a List of Lists

因此,我正在研究 Scheme(MIT Scheme)中的排序。我已经弄清楚如何对基本整数列表进行排序,但是我似乎不太清楚如何对列表列表进行排序。下面是通过选择排序对整数列表进行排序的代码:

(define sortdata
    (lambda (lst min)
        (cond ((null? lst) min) ;null list, return current
        ((< (car lst) min) (sortdata (cdr lst) (car lst))) ;compare with head of list 
        (else (sortdata (cdr lst) min))
        )
    )
)

我对scheme不是很了解,因为我刚开始使用它。而不是像这样对列表进行排序:( 4 8 9 2 6 15 3),我试图对列表列表进行排序,但仅按子列表的一个字段(在本例中为年龄)进行排序。比如这样:(("bob" 17)("mary" 14)) [假设第一个字段是名字,第二个是年龄。]

编辑:因此,排序后的列表将如下所示:(("mary" 14)("bob" 17))

非常感谢任何能帮助我或给我提供好的参考的人!

由于您使用的是比较排序算法,因此对除整数以外的其他内容进行排序会相当容易。基本上,您需要做的是参数化比较器。在您当前的示例中,这是函数 <,但是它可以是任何东西!

注意您的代码无法运行,但您已经快完成了。所以我将保持原样,只向您展示如何做到这一点。

(define sortdata
    (lambda (lst min comparer)
        (cond ((null? lst) min) ;null list, return current
        ((comparer (car lst) min) (sortdata (cdr lst) (car lst))) ;compare with head of list 
        (else (sortdata (cdr lst) min)))))

在这种情况下,您的比较对象可能是:

(lambda (x y) (> (cadr x) (cadr y)))

此 lambda 将获取每个人的年龄 (cadr) 并将他们相互比较。

希望对您有所帮助!

简介

搜索的基本要素是:

  • Table: 记录集合
  • 记录:字段集合
  • 字段:感兴趣的值。

为您的记录创建一种语言

(define name car)
(define grade cadr)

;; record record -> record
(define (return-record-with-greater-name record1 record2)
  (if (name>? record1 record2)
      record1
      record2))

(define name>?
  (make-record-compare-function string> name))

制作一种比较记录的语言

;;; This is a partial implementation

;; [any? any? -> boolean] [listof any? -> any?] -> [listof any? -> any?]
(define (make-record-compare-function predicate field)
  (lambda (record1 record2)
    (predicate (field record1) (field record2))))

制作一种搜索表格的语言

;;; This is a partial implementation

;; [any? any? -> any?] -> [listof any? -> any?]
(define (make-table-search comparator)
  (define  (inner table best-match)
    (if (null? table)
    best-match
    (inner (cdr table)
           (comparator best-match
               (car table)))))
  (lambda (table)
    (inner (cdr table)
           (car table))))

用法

racket> (define record1 (list "mary" 14))

racket> (define record3 (list "Ben" -42))
racket> (define record2 (list "bob" 17))
racket> (define sort-by-name
                 (make-table-search return-record-with-greater-name))
racket> (sort-by-name (list record3 record1 record2))
'("mary" 14)