如何使用子列表对列表进行排序

时间:2010-11-02 16:23:02

标签: scheme

对颜色列表进行排序。

如果两种颜色的红色值相同,那么绿色值较小的值将在排序中首先出现。如果两种颜色具有相同的红色和绿色值,则具有较小蓝色值的颜色将在排序中首先出现。

示例:让颜色列表为

((72 75 0) (0 0 10) (255 255 255) (0 10 10) (0 10 8)(50 100 255))

然后程序将返回

((0 0 10) (0 10 8) (0 10 10) (50 100 255) (72 75 0) (255 255 255))

1 个答案:

答案 0 :(得分:2)

您应该编写一个自定义比较器进行排序:

(define color-comparator
  (lambda (c1 c2)
    (cond
      ((not (= (car c1) (car c2))) (< (car c1) (car c2)))     ; red
      ((not (= (cadr c1) (cadr c2))) (< (cadr c1) (cadr c2))) ; green
      (else (< (caddr c1) (caddr c2))))))                     ; blue

然后您可以将此功能传递给sort程序。

狡诈:

(sort
  '((72 75 0) (0 0 10) (255 255 255) (0 10 10) (0 10 8)(50 100 255))
  color-comparator)

Chez Scheme:

(sort
  color-comparator
  '((72 75 0) (0 0 10) (255 255 255) (0 10 10) (0 10 8)(50 100 255)))