如果值相等,如何使用二次排序对列表进行排序?

How to sort a list with a secondary sort if the values are equal?

我想按字母顺序对列表进行排序。如果字符串相同,则按数字递增排序。

(define players(list (list "Arnold" 66 )
                     (list "Butter" 77 )
                     (list "Nutter" 18 )
                     (list "Butter" 5 )
                     (list "Nutter" 2 )
                     (list "Butter" 1 )))


(sort players (lambda (a b) (string<? (first a)(first b))) )

(check-expect (sort players
 (lambda (a b) (string<? (first a)(first b))) )
              (list (list "Arnold" 66 )
                     (list "Butter" 77 )
                     (list "Butter" 5 )
                     (list "Butter" 1 )
                     (list "Nutter" 18 )
                     (list "Nutter" 2 )))
              

目前我可以按字母顺序排序,但是当字符串相同时,我不知道如何按递增的顺序排序。如何在不使用递归的情况下对其进行排序?我只能使用抽象列表函数和 lambda。

您可以使用以下作为排序函数:

(λ (a b) 
  (if (string=? (first a) (first b))
      (< (second a) (second b))
      (string<? (first a) (first b))))

本质上,如果字符串相同,则检查数字(第二个位置)。否则,如果字符串不同,请使用与之前相同的操作。