按特定元素对3个元素的列表进行排序,然后显示

时间:2014-04-06 02:55:37

标签: scheme

在我的程序中,用户将为每个学生输入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

我完成了生成列表的功能,但我正在努力排序列表和显示。任何帮助将不胜感激,谢谢

2 个答案:

答案 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