2011-01-05 22 views
7

Soy un novato en Lisp y quiero aprender programación Lisp. deseo aclarar algunas listas leídos desde un archivo de texto, como en la siguiente forma:ordenando listas de acuerdo con algunos elementos

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

¿Cuál es la mejor manera de clasificarlos según el primer elemento de enteros o tal vez segundo o tercero y así sucesivamente?

tengo la siguiente idea:

  1. leído todos y ponerlos en una lista de listas
  2. iterar sobre la lista de contenedores y comparar los valores de la lista con la siguiente, como en una especie de burbuja.

¿Existen estructuras de datos más adecuadas para lograr esto, tal como las Colecciones en Java que toman objetos comparables que contienen lógica de ordenamiento y clasificación de llenado de forma automática?

Muchas gracias.

Respuesta

10

La función estándar sort toma un argumento :key que se puede utilizar para extraer un valor del objeto que se utilizará como la clave de clasificación. Por su ejemplo, si usted tenía cada lista a partir del archivo en una lista llamada objects, lo siguiente sería destructiva tipo objects por el primer elemento de enteros y devolver una lista ordenada:

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

Ver http://l1sp.org/cl/sort para la especificación exacta del Común Función de Lisp 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))) #'<)) 

prueba:

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