2011-01-05 56 views
7

Tôi là người mới trong Lisp và tôi muốn học lập trình Lisp. Tôi muốn sắp xếp một số danh sách đọc từ một tập tin văn bản, như trong các hình thức sau đây:sắp xếp danh sách theo một số yếu tố

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

cách tốt nhất để sắp xếp chúng theo các yếu tố số nguyên đầu tiên hoặc có thể thứ hai hoặc thứ ba và vân vân là gì?

Tôi có ý tưởng sau đây:

  1. đọc tất cả chúng và đặt chúng vào một danh sách liệt kê
  2. lặp qua danh sách container và so sánh các giá trị của danh sách với sau một như trong bong bóng sắp xếp.

Có cấu trúc dữ liệu phù hợp hơn để đạt được điều này, có thể như Bộ sưu tập trong Java lấy các đối tượng tương đương có chứa sắp xếp logic và sắp xếp tự động điền?

Cảm ơn bạn rất nhiều.

Trả lời

10

Hàm chuẩn sort lấy một đối số :key có thể được sử dụng để trích xuất một giá trị từ đối tượng để sử dụng làm khóa sắp xếp. Ví dụ, nếu bạn có mỗi danh sách từ các tập tin trong một danh sách gọi là objects, sau triệt tiêu loại objects bởi các yếu tố số nguyên đầu tiên và sẽ trả về một danh sách sắp xếp:

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

Xem http://l1sp.org/cl/sort cho đặc điểm kỹ thuật chính xác của Common Hàm sort của Lisp.

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))) #'<)) 

Test:

> (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) 
Các vấn đề liên quan