Chuyển đến nội dung
Diễn đàn CADViet
--NK--

[Yêu cầu] Lisp sắp xếp trong danh sách.

Các bài được khuyến nghị

Mình có 1 danh sách gồm các cặp dấu chấm như thế này :

(("L150x75x9" . "3500")("L75x75x6" . "365")("L75x75x9" .  "650")("L75x75x6" . "1200")(L100x75x7" . "1500"))

Mình muốn nó sắp xếp theo thứ tự như sau:

       - Đầu tiên ưu tiên sắp xếp theo Size (theo trình tự L150 - L100 - L75)

       - Nếu giống nhau về size thì theo kích thước vd : ("L75x75x6" . "1200") thì đứng trước ("L75x75x6" . "365")

       - Nếu giống nhau về loại size như L75 thì sắp xếp theo bề dày : vd -- L75x75x9  thì đứng trước L75x75x6

 

 

Kết quả mong muốn :

(("L150x75x9" . "3500")(L100x75x7" . "1500")("L75x75x9" .  "650")("L75x75x6" . "1200")("L75x75x6" . "365"))--> OK

 

Mong sự giúp đỡ của mọi người.

Cảm ơn sự hồi đáp.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Hàm sort của bạn khá là phức tạp.

Lisp đây!


;Doan Van Ha - CADViet.com - Ngay 29/5/2013
;Chuc nang: sort 1 list phuc tap.
;-----  Sort list
;(setq lst '(("L75x75x6" . "356") ("L75x75x6" . "1400") ("L100x75x7" . "1400") ("L100x75x7" . "1200") ("L75x75x9" . "1400") ("L150x90x9" . "3200")))
; => '(("L150x90x9" . "3200") ("L100x75x7" . "1400") ("L100x75x7" . "1200") ("L75x75x9" . "1400") ("L75x75x6" . "1400") ("L75x75x6" . "356"))
(defun HA(lst)
 (vl-sort lst '(lambda(a b / xx yy)
   (setq xx (HA:ass->lst a "x") yy (HA:ass->lst b "x"))
   (if (/= (car xx) (car yy))
    (> (car xx) (car yy))
    (if (/= (cadr xx) (cadr yy))
     (> (cadr xx) (cadr yy))
     (if (/= (caddr xx) (caddr yy))
      (> (caddr xx) (caddr yy))
      (> (cadddr xx) (cadddr yy))))))))
(defun HA:ass->lst(ass del / str pos lst)
 (setq str (substr (car ass) 2 (strlen (car ass))))
 (while (setq pos (vl-string-search del str))
  (setq lst (cons (substr str 1 pos) lst) str (substr str (+ pos 1 (strlen del)))))
 (mapcar 'read (reverse (cons (cdr ass) (cons str lst)))))
 

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình đã test thử--> chạy ok

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

Mình kẹt ở đây đã 3 ngày mà nghĩ chưa ra.

 

Chúc 1 ngày tốt lành. :D

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×