2010-11-02 95 views
2

對顏色列表進行排序。如何使用子列表對列表進行排序

如果兩種顏色的紅色值相同,則綠色值較小的值會在排序中首先出現。如果兩種顏色具有相同的紅色和綠色值,則具有較小藍色值的一種顏色會在排序中首先出現。

例子:讓顏色列表是

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

回答

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) 

切斯方案:

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

這怎麼可能可以不使用內置在方案中 「排序」 程序做了什麼? – Joe 2010-11-02 17:16:24

+0

只要按自己喜歡的方式編寫自己的排序函數,但不會比使用內置排序更高效。編寫它是最容易的,因此它需要一個列表和一個比較器。 – erjiang 2010-11-02 18:34:36

+0

這個函數在普通的lisp中看起來(代碼)而不是在方案中?謝謝,JP – 2011-05-14 17:43:27

相關問題