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