2010-11-02 2 views
2

Trier une liste de couleurs.Comment trier une liste avec des sous-listes

Si les valeurs rouges des deux couleurs sont les mêmes, celle dont la valeur verte est la plus petite apparaît en premier dans la commande. Si deux couleurs ont la même valeur rouge et verte, alors celle avec la plus petite valeur bleue apparaît en premier dans la commande.

Exemple: que la liste des couleurs soit

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

Ensuite, la procédure retournerait

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

Répondre

2

Vous devez écrire un comparateur personnalisé pour le tri:

(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 

Ensuite, vous pouvez simplement passez cette fonction à la procédure sort.

Guile:

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

Comment cela pourrait-il être fait sans utiliser le construit dans la procédure "de tri" dans le schéma? – Joe

+0

Il vous suffit d'écrire votre propre fonction de tri, mais ce ne sera pas plus efficace que d'utiliser le tri intégré. Il est plus facile de l'écrire pour qu'il prenne une liste et un comparateur. – erjiang

+0

Comment cette fonction ressemblerait (code) dans le lisp commun à la place dans le schéma? Merci, JP –