2011-01-05 11 views
7

Sono un principiante in Lisp e voglio imparare la programmazione Lisp. voglio ordinare alcuni elenchi letti da un file di testo, come il seguente modulo:elenchi di ordinamento in base ad alcuni elementi

(a 120 135 124 124) 
(b 120 135 124 124) 
(c 120 135 124 124) 

Qual è il modo migliore per ordinarli secondo il primo elemento intero o forse secondo o terzo e così via?

Ho la seguente idea:

  1. leggerli tutti e metterli in una lista di liste
  2. iterare la lista contenitore e confrontare i valori di elenco con successivo come in bubble sort.

Esistono strutture di dati più adatte a questo scopo, forse come le raccolte in Java che prendono automaticamente oggetti comparabili contenenti logica di ordinamento e ordinamento completo?

Grazie mille.

risposta

10

La funzione standard sort accetta un argomento :key che può essere utilizzato per estrarre un valore dall'oggetto da utilizzare come chiave di ordinamento. Per il vostro esempio, se si ha ogni elenco dal file in un elenco chiamato objects, il seguente sarebbe distruttivo sorta objects dal primo elemento intero e restituire un elenco ordinato:

(sort objects #'< :key #'second) 

Vedere http://l1sp.org/cl/sort per l'indicazione precisa del Comune Funzione Lisp's sort.

1
(defun position-of-first-int (alist) 
    (position (find-if 
      #'(lambda (x) (not (numberp x))) 
      alist) 
      alist)) 

(defun sort-from-first-int (alist) 
    (sort (subseq alist (1+ (position-of-first-int alist))) #'<)) 

prova:

> (setf a '(a 120 135 124 124)) 
> (setf b '(120 b 135 124 124)) 
> (setf c '(120 135 c 124 110)) 

> (format t "~a~%" (sort-from-first-int a)) 
(120 124 124 135) 
> (format t "~a~%" (sort-from-first-int b)) 
(124 124 135) 
> (format t "~a~%" (sort-from-first-int c)) 
(110 124) 
Problemi correlati