在我的程序中,用户将为每个学生输入3个元素:
ID
Name
Grade
这些被放入一个看起来像(一个方案列表)的列表
( (001 "Bob" 80) (002 "Sam" 85) (003 "Aaron" 94) etc . . .)
如果用户选择按名称排序,我会像列表一样显示如下信息:
No.1: ID=003, Name=’’Aaron’’, Grade=94
No.2: ID=001, Name=’’Bob’’, Grade=80
No.3: ID=002, Name=’’Sam’’, Grade=85
我完成了生成列表的功能,但我正在努力排序列表和显示。任何帮助将不胜感激,谢谢
答案 0 :(得分:2)
在Wikibooks中可以找到Scheme中的sort实现。它被称为mergesort
。从本质上讲,它假定您可以使用<
来比较列表中的两个元素以进行排序。
您可以修改mergesort
以获取其他参数less-proc
,并在使用<
的任何地方使用它。
然后您可以使用以下方式致电mergesort
(mergesort lst (lambda (a b) (string<? (cadr a) (cadr b))))
答案 1 :(得分:1)
查看您的口译员文档,了解sorting procedure。例如,在Racket中,您可以对以下列表进行排序:
(define lst '((001 "Bob" 80) (002 "Sam" 85) (003 "Aaron" 94)))
升序,使用名称:
(sort lst #:key second string<?)
=> '((3 "Aaron" 94) (1 "Bob" 80) (2 "Sam" 85))
降序,使用等级:
(sort lst #:key third >)
=> '((3 "Aaron" 94) (2 "Sam" 85) (1 "Bob" 80))
......你明白了。对于问题的第二部分,请再次参考您的口译员文档。在Racket printf
中派上用场 - 例如,在按名称排序后打印记录:
(for ([i (in-naturals 1)]
[record (sort lst #:key second string<?)])
(printf "No.~a: ID=~a, Name=’’~a’’, Grade=~a~n"
i
(~a (first record) #:min-width 3 #:align 'right #:left-pad-string "0")
(second record)
(third record)))
=> No.1: ID=003, Name=’’Aaron’’, Grade=94
No.2: ID=001, Name=’’Bob’’, Grade=80
No.3: ID=002, Name=’’Sam’’, Grade=85