List 对嵌套列表排序
我想按字母顺序对嵌套的字符串列表进行排序,例如:List 对嵌套列表排序,list,sorting,scheme,racket,List,Sorting,Scheme,Racket,我想按字母顺序对嵌套的字符串列表进行排序,例如: (list (list "Worcestershire" "Edinburgh") (list "Suffolk" "Liverpool") (list "Norfolk" "York") (list "Lincoln" "Malmesbury") (lis
(list
(list "Worcestershire" "Edinburgh")
(list "Suffolk" "Liverpool")
(list "Norfolk" "York")
(list "Lincoln" "Malmesbury")
(list "Glasgow" "Desmond"))
所以对于这一个,我只想按照每个子列表中的第一个单词对它进行排序(请暂时忽略第二个单词)。我的代码在这里:
(define (sort lst)
(cond [(empty? lst) empty]
[else (insert (first (first lst)) (second (first lst))
(sort (rest lst)))]))
;; helper function
(define (insert element1 element2 lst)
(cond [(empty? lst) (list element1 element2)]
[(string<=? element1 (first lst)) (cons element1 lst)]
[else (cons (first lst) (insert element1 element2 (rest lst)))]))
但现在它正在生产
(list "Glasgow" "Desmond" "Lincoln" "Malmesbury"
"Norfolk" "Suffolk" "Worcestershire" "York")
列表没有嵌套,甚至缺少一些组件!有人能检查一下我的代码吗?你写的
(define (sort lst)
(cond [(empty? lst) empty]
[else (insert (first (first lst))
(second (first lst))
(sort (rest lst)))]))
这显然假设lst
是[(a1b1)(a2b2)…(anbn)]
,然后它定义(以伪代码写入)
和排序[]=[]
从这一点我们可以看出,它必须保持这一点
sort [(a1 b1)] == insert a1 b1 (sort [])
== insert a1 b1 []
== [(a1 b1)]
这就给了我们关于插入的部分定义,甚至在我们自己开始编写之前
因此,您的insert
定义必须更正为
;; helper function
(define (insert e1 e2 lst)
(cond [(empty? lst) (list (list e1 e2))]
[(string<=? e1 (first (first lst)))
(cons (list e1 e2) lst)]
[else (cons (first lst)
(insert e1 e2 (rest lst)))]))
;;辅助函数
(定义(插入e1 e2 lst)
(条件[(空?lst)(列表(列表e1 e2))]
[(STRING这是否回答了您的问题?@amalloy抱歉,但不完全是,理想情况下,我想按插入排序(如代码部分所示)这正是我想要的!谢谢(:不客气。:)如果您发布更多的计划/骗局问题,您可以在这里ping我,提醒我注意。:)很抱歉再次打扰您,但是您如何对列表中的第二个元素进行排序,而不打乱第一个元素的排序顺序?我已经尝试了几个小时,但无法正确排序。第二个元素只有在第一个元素相同的情况下才应自行排序。我在那里写了一个示例,您能检查一下吗?谢谢。当然,朱请发布新问题。我已回滚您的编辑,因为编辑不能使现有答案无效。在您的新问题中,如果您愿意,您可以包含指向此问题的链接作为背景。(当/如果有人投票支持您的新问题,和/或您接受答案,您甚至可以获得更多分数:)。但为了给您一个提示,[(字符串)
sort [(a1 b1)] == insert a1 b1 (sort [])
== insert a1 b1 []
== [(a1 b1)]
;; helper function
(define (insert e1 e2 lst)
(cond [(empty? lst) (list (list e1 e2))]
[(string<=? e1 (first (first lst)))
(cons (list e1 e2) lst)]
[else (cons (first lst)
(insert e1 e2 (rest lst)))]))