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)
因此,我正在研究 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)