這是我寫的, 未做錯誤檢查, 請大家參考:
(defun mySort(lst lstKey / i n) (setq i 0) (repeat (length lstKey) (setq n (nth i lstKey)) (setq lst (vl-sort lst (function (lambda (e1 e2) (< (nth n e1) (nth n e2)))))) (setq i (1+ i)) ) lst )
(setq lst '((1 3)(2 2)(1 2)(3 1)(2 1)(3 2)(2 3)(1 1)(3 3))) 對X排序 (mySort lst '(0)) 返回: '((1 3) (1 2) (1 1) (2 2) (2 1) (2 3) (3 1) (3 2) (3 3)) 對Y排序 (mySort lst '(1)) 返回: '((3 1) (2 1) (1 1) (2 2) (1 2) (3 2) (1 3) (2 3) (3 3)) 對X再Y排序 (mySort lst '(0 1)) 返回: '((1 1) (2 1) (3 1) (1 2) (2 2) (3 2) (1 3) (2 3) (3 3)) 對Y再X排序 (mySort lst '(1 0)) 返回: '((1 1) (1 2) (1 3) (2 1) (2 2) (2 3) (3 1) (3 2) (3 3)) 如果要對X再Y再Z排序 (mySort lst '(0 1 2)) .....
此程序適合資料庫之多欄位排序,
例如有一資料庫第7個欄位是電話號碼,
則可以如下應用 ---> (mySort lstDB '(6))
如果要順排或逆排, 程序可以改寫如下:
(defun mySort(lst lstKey mode / i n) (setq i 0) (repeat (length lstKey) (setq n (nth i lstKey)) (setq lst (vl-sort lst (function (lambda (e1 e2) (< (nth n e1) (nth n e2)))))) (setq i (1+ i)) ) (if (and mode (= (strcase mode) "D")) (reverse lst) lst) )
(mySort lst '(1 0) nil) 返回: '((1 1) (1 2) (1 3) (2 1) (2 2) (2 3) (3 1) (3 2) (3 3)) (mySort lst '(1 0) "A") 返回: '((1 1) (1 2) (1 3) (2 1) (2 2) (2 3) (3 1) (3 2) (3 3)) (mySort lst '(1 0) "D") 返回: '((3 3) (3 2) (3 1) (2 3) (2 2) (2 1) (1 3) (1 2) (1 1)) |