【问题标题】:Scheme - Sorting a List of Lists方案 - 对列表列表进行排序
【发布时间】:2015-04-15 05:24:52
【问题描述】:

所以,我正在研究 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))
        )
    )
)

因为我刚开始使用它,所以我对方案不是很精通。而不是像这样对列表进行排序:(4 8 9 2 6 15 3),我试图对列表列表进行排序,但仅按子列表的一个字段(在这种情况下为年龄)。如:(("bob" 17)("mary" 14)) [假设第一个字段是姓名,第二个字段是年龄。]

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

非常感谢任何可以帮助或为我提供良好参考的人!

【问题讨论】:

  • 您的整数排序代码似乎不起作用。

标签: list sorting scheme


【解决方案1】:

简介

搜索的基本要素是:

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

为您的记录制作一种语言

(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)

【讨论】:

    【解决方案2】:

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

    注意您的代码不起作用,但您快到了。所以我会保持原样,只是向您展示如何做到这一点。

    (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) 并将他们相互比较。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-11
      • 2018-12-22
      • 1970-01-01
      相关资源
      最近更新 更多